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.

75
Updates

Sitewide SEO Reliability Audit

SEO SITEWIDE AUDIT STRUCTURED DATA
  • From audit to evidence: reviewed all 212 public URLs in the sitemaps, then handled the confirmed issues as small, separately verified changes rather than one risky bulk rewrite.
  • Clearer page identity: corrected conflicting titles and descriptions, repaired article-template copy that had leaked between topics, aligned breadcrumbs and visible FAQ content, and refreshed stale tool-count and release wording.
  • More trustworthy structured data: corrected Schema types and malformed JSON-LD text, completed required article fields, synchronized page claims with visible content, and verified all 547 JSON-LD blocks parse successfully.
  • Stronger crawl and mobile foundations: repaired viewport behavior, checked 7,697 internal links and resource references, confirmed every public page is reachable from the homepage within two clicks, and synchronized sitemap modification dates and llms.txt inventory data.
  • Production verification: all 212 sitemap URLs passed the static audit; 95 BlogPosting records contain their core publishing fields; five sitemap files parse correctly; and representative pages passed desktop and mobile browser checks without horizontal overflow, script errors, or structured-data failures.
  • No tool behavior changed: this release improves discoverability, consistency, and machine-readable metadata without changing the processing logic of ToolKnit tools. Historical publication dates and privacy/legal wording that require source evidence or an explicit policy decision remain documented for separate review instead of being guessed.

Homepage Catalog: Faster Browsing for Large Tool Libraries

HOMEPAGE MOBILE USABILITY
  • Progressive tool browsing: the All Tools catalog now starts with a focused selection and reveals more tools in clear batches, shortening the first mobile browse without removing any tool from the page.
  • Search and categories stay complete: every category continues to show its full set of tools, and a search always reveals every matching result instead of limiting the result set to the initial batch.
  • Bilingual and accessible controls: the visible-count and reveal action follow the current English or Chinese interface, announce updates politely, and keep all tool links present in the source for direct access and indexing.

Performance Pass: Smoother Local Processing Across Four Tools

PERFORMANCE RELIABILITY P0 FIXES
  • Background Remover: manual cleanup, transparent-edge trimming, and export keep the existing local-AI and WebGPU/WASM fallback behavior while moving the heaviest trim scan work away from interaction-critical UI work.
  • Silk Screen: preview rendering and PNG export now use a dedicated Worker where the browser supports it, with a compatible Canvas fallback for every other browser.
  • Compress PDF: target-size searches reuse prepared source pages instead of re-rendering the original PDF for each candidate, reducing repeated work and keeping the existing byte-limit verification intact.
  • PDF to Word: OCR preprocessing now runs in a dedicated Worker. Standard A4 and Letter scans retain the previous 3x render quality, unusually large pages are bounded safely, and an automatic Canvas fallback preserves compatibility.
  • Reliable rollout: the offline cache now precaches the current scripts and Workers for all four updated tools, so the deployed code and the cached code stay aligned.

Background Remover: Safer Local AI, Better Editing & Flexible Export

MAJOR UPGRADE LOCAL AI OPEN SOURCE DEV JOURNAL
  • A clearer local-AI setup: the first run now explains that the pinned, self-hosted @imgly/background-removal v1.5.5 engine may download up to 109.5 MB of AI model and WebAssembly resources. The download begins only after confirmation, can be reused from the browser cache, and never sends image pixels away from the device.
  • More capable mask refinement: restore or erase areas with adjustable brush size and edge softness, undo or clear edits, hold to compare with the original, and inspect details with fit, zoom, and pan controls across mouse, touch, and pen input.
  • Flexible preview and export: review the cutout against transparent, white, black, or custom backgrounds; auto-trim transparent edges; add a margin; feather the final edge; and export at full resolution as PNG, WebP, or background-filled JPG.
  • Safer production limits: added real image decoding checks, a 20 MB file limit, device-aware pixel and Canvas budgets, cleaner resource release, and guardrails that stop images and exports before unsafe browser limits are exceeded.
  • Open-source transparency: published the exact upstream commit, source archive, AGPL-3.0 license, third-party notices, artifact manifest, hashes, and a reproducible build recipe. The relevant terms, permanent page links, and offline cache now point to the same records.
  • Faster inference and dependable editing: compatible Chrome and Edge builds now use WebGPU automatically with a safe WASM fallback, while a lower-memory 1024px mask pipeline removes the previous full-resolution PNG round trip. The manual editor now opens on the final cutout with Remove Residue selected, and a fresh cache version restores every translated control after deployment.
  • Release references synchronized: refreshed bilingual copy, accessibility labels, structured data, sitemaps, Service Worker assets, and llms.txt so users, browsers, and indexing systems describe the same production behavior.
  • Availability incident — resolved: Cloudflare returned 526 Invalid SSL Certificate for several hours after the origin certificate renewal was missed and automatic renewal had not been configured. The certificate has been renewed and service restored. Automatic renewal plus expiry and renewal-failure alerting are recorded as follow-up work on the status page.
Developer’s Note

Over the past few days, ToolKnit has been seeing around 500 uses a day, and that honestly makes me very happy. For a project that began as one person’s small idea, this feels like both a real achievement and a promising beginning. I keep wondering how I will feel when ToolKnit reaches 1,000 uses in a single day. You can probably guess, haha.

ToolKnit Desktop v1.2 is now released and open source. Version 1.3 is already on my mind, although I am still working out what it should become. I do not want to rush a version number; I want the next release to feel meaningfully better.

And then there is sleep. I have not slept well for several months. Sometimes I stay up because there is one more bug to fix; sometimes the laptop is closed and sleep simply does not arrive. Seriously, what do people do about insomnia? Going to bed on time currently feels like the one feature I still cannot ship.

Still, today feels good. Around 500 uses a day means ToolKnit is becoming part of real people’s routines. Thank you for every visit, recommendation, issue report, and kind message. One useful improvement at a time, let us see when that 1,000 arrives — and whether I am awake to witness it.

Zihang Dong Aug 5, 2026 — grateful for 500 a day, dreaming of 1,000 (and some sleep)

ToolKnit Desktop v1.2 Page Refresh

DESKTOP V1.2 OPEN SOURCE BILINGUAL
  • A complete v1.2 showcase: rebuilt the desktop page around more than 30 local PDF, image, audio, video, text, calculator, creative, and AI workflows, with dedicated coverage for CLI and MCP access.
  • Open development, easier to follow: downloads now lead directly to GitHub Releases, the source repository is always one click away, and the page retrieves the current GitHub star count with a resilient fallback.
  • Support from the first screen: added a discreet “Buy the developer a coffee” button that opens ToolKnit’s donation story page.
  • English and Chinese throughout: the new page, including the support action, switches cleanly between both languages and remains usable on compact mobile screens.

Daily Planner Polish & Strict Image and PDF Target Sizes

EXPORT IMPROVEMENT TARGET SIZE DEV JOURNAL
  • Three distinct visual templates: Paper, Noir, and Editorial now give the Daily Planner a clean print look, a high-contrast poster option, and a magazine-style layout.
  • Fixed formats that travel well: choose 9:16 Story, 4:5 Post, or A4 Print. Long entries now wrap automatically and continue onto clear, numbered pages instead of running out of bounds.
  • Better export coverage: download the current page as PNG, collect multi-page planners in a ZIP, or create a standard multi-page PDF directly in the browser.
  • Clearer bilingual discovery: refreshed the English and Chinese guidance, FAQ, and structured metadata so the template, aspect-ratio, wrapping, and print features are easier to understand before planning.
  • Compress Image to an exact upper limit: choose common upload caps from 50 KB to 10 MB or enter a custom value. Every successful target-size result is checked against its real encoded bytes before it can be downloaded.
  • Quality before dimensions: the image compressor searches for the best fitting JPG or WebP quality first and only reduces dimensions proportionally when necessary. Transparent PNGs remain transparent, and an optional Smart WebP mode is available when compatibility allows.
  • Truthful batch results: the selected cap applies to each image, not the whole ZIP. Files that cannot honestly meet it, including oversized animated GIFs that must retain every frame, are visibly excluded rather than mislabeled as successful.
  • Compress PDF to a strict maximum: choose a common limit or enter any target from 50 KB to 50 MB. The compressor searches for the closest readable result below that ceiling and verifies the completed PDF's actual byte size before enabling download.
  • Clear, honest failure handling: an original PDF already within the limit is kept unchanged. If even the minimum safe render cannot meet the selected size, ToolKnit reports that outcome instead of offering an oversized file as a success.
  • Transparent document trade-off: target-size mode rebuilds every page as an optimized JPEG image. The page appearance is preserved, while searchable text, links, forms, bookmarks, and accessibility tags are intentionally not carried into the compressed copy.
Developer’s Note

Somewhere along the way, I realized that I have been focused on this one thing for almost five months. I have never shown this kind of persistence before. Maybe some things in life, especially matters of the heart, closed part of me off for a while. It sometimes felt as though there was room for only two things: a quiet life and ToolKnit.

But I am happy now. So many people have chosen to use ToolKnit, support it, recommend it, send feedback, and build alongside me. That support has made this project feel much less like something I am doing alone. I will do my best to keep building ToolKnit with all of you, one useful improvement at a time. Thank you, truly.

Today’s update is another substantial one: Daily Planner can now export polished poster images and print-ready PDFs, while Image Compression and PDF Compression can now target verified maximum file sizes. ToolKnit Desktop is moving forward too. CLI access and AI agent integrations are coming soon, and the work will continue in the open on GitHub.

Nearly five months in, I am still here — a little quieter, a little stronger, and genuinely glad to be building this with you.

Zihang Dong Aug 2, 2026 — almost five months in, still building together

Whiteboard V3, Desktop Momentum & a Huge Milestone

MILESTONE IMPROVEMENT DEV JOURNAL
  • Whiteboard V3: rebuilt the drawing workspace around Fabric’s object model for dependable selection, movement, resizing, layering, text editing, image handling, and undo/redo.
  • More reliable sessions: added automatic local recovery, clearer layer controls, responsive mobile tools, and refreshed offline caching for the upgraded whiteboard experience.
  • Open-source momentum: one day after ToolKnit Desktop v1.0 was open-sourced, the project passed 150 GitHub stars and its Douyin launch post reached 300,000 views with more than 6,400 likes.
Developer’s Note

August 1, 2026 feels like a huge milestone for ToolKnit. Just one day after we open-sourced ToolKnit Desktop v1.0 on GitHub, it reached 150+ stars. On Douyin, the post reached 300,000 views and 6,400+ likes. Honestly, I never expected numbers like these.

Desktop had almost no users at first. I had even started to think I might not keep working on it. This response changed my mind: I should keep updating it regularly. Please wait for the open-source ToolKnit Desktop v1.2 release. It will be better.

The web app has been moving too. In a little over a day, ToolKnit recorded 2,000+ uses — the same volume we had seen over the previous week. Our Douyin community has opened a second group because the first is full. The milestones keep rising. I welcome every website directory and index that includes ToolKnit: it only has meaning because of the people who use and share it.

Yesterday, two supporters donated RMB 15 and RMB 8.88 via WeChat Pay. I do not know who you are, but I would love the chance to thank you personally. You gave me the energy to keep going. Thank you, everyone.

Zihang Dong Aug 1, 2026 — grateful and still building

Homepage Translation Cache Fix

FIX IMPROVEMENT
  • Image Stitcher Chinese card restored: versioned the homepage language loader so the newly released Image Stitcher card consistently loads its Chinese title and description instead of inheriting an older cached language bundle.
  • Reliable language refresh: synchronized the homepage, hero demo, and offline cache with the latest Chinese locale bundle so newly added tool cards cannot be left untranslated by a stale browser cache.

Image Stitcher Release & Tool Directory Baseline

FIX IMPROVEMENT SEO DEV JOURNAL
  • Complete public directory: restored seven missing live-tool links in the What Is ToolKnit? overview, covering Lyric Visualizer, ASCII Art, ASCII Banner, Emoji Finder, Spin the Dare, Breathing Relaxation, and Quit Smoking Tracker.
  • Accurate category copy: refreshed the Self-Test section so the private Quit Smoking Tracker is represented alongside the Emotional Neglect Test.
  • One release checklist: added an authoritative new-tool workflow that separates mandatory site-wide synchronization from conditional work such as blogs, new categories, large dependencies, desktop parity, and IndexNow.
  • New tool — Image Stitcher: arrange local images into a seamless vertical long image or horizontal strip, control shared sizing, spacing and background, then download a PNG or JPG. Composition and export use Canvas/OffscreenCanvas entirely in the browser.
  • Connected PDF workflow: completed PDF to Image results now offer a direct handoff to Image Stitcher. Ordered page-image Blobs are transferred locally through short-lived IndexedDB storage, without URL payloads or uploads.
  • ToolKnit Desktop is now open source: release downloads now open from the official GitHub v1.0.0 release, and the full desktop repository is available at ZihangDong/toolknit-desktop.
  • Current operational references: synchronized the public directory, site maps, offline cache, public stats and release documentation for 92 functional pages, including 91 dedicated tools and the World Holidays Hub.
Developer’s Note

July 30, 2026. Two days ago, someone in a Douyin group told me about a missing piece in their workflow. They could turn a PDF into images on ToolKnit, but then had to leave the site and find another tool to stitch those images into a long vertical image — or a wide horizontal one. They also said the alternatives did not feel as good as ToolKnit. I saw the message, and I made a promise.

Today, two days later, that promise is kept. Image Stitcher is live: add images, arrange them, make a seamless long image in either direction, and download it as PNG or JPG. Better still, PDF to Image now has a one-click Open in Image Stitcher button after conversion, so the pages can go straight into the next step. No detour. No starting over. I hope that group member is smiling now. Haha.

Another member also told me they had recommended ToolKnit to someone else. That may sound like a small thing, but for a solo builder it lands differently. It means the tools were useful enough to be passed along, and that is a real kind of achievement. I am genuinely happy about it.

Today was not supposed to be an update day. But when someone who uses the site has a real need, I want ToolKnit to listen. So we built it. That is the whole philosophy: users ask, we make it better. Let’s go.

I’m Zihang Dong. If you have a bug, a problem, a missing feature, or just an annoying little task you wish ToolKnit could solve, please contact me right away at 2645149786@qq.com. I read the messages.

Zihang Dong Jul 30, 2026 — a promise kept, one click closer

PDF & Image Workflow Security, Search Cleanup & Production Fixes

IMPROVEMENT FIX SECURITY SEO DEV JOURNAL

A professional upgrade for PDF to Image is now complete, combining a safer processing foundation with faster page selection, clearer output planning, and more reliable downloads.

  • Safer PDF processing: upgraded this converter’s PDF.js engine to the patched, self-hosted version 4.10.38
  • No runtime CDN dependency: PDF.js and JSZip are now served directly by ToolKnit, reducing third-party availability and loading risks for this page
  • Reliable cancellation and cleanup: stopping or resetting a conversion now cancels active rendering and releases PDF documents, workers, canvases, and temporary Blob URLs
  • Honest conversion feedback: complete success, partial success, full failure, and cancellation now have distinct states so users always know what happened
  • Cleaner bilingual result states: fixed the screen-reader completion announcement appearing as visible text above the footer, and kept completed conversion messages synchronized when switching between English and Chinese
  • Precise page selection: convert every page, a typed range, odd or even pages, or choose from low-memory visual thumbnails in 12-page batches
  • Professional output controls: added 72, 150, 300, and custom 36–600 DPI, white or transparent backgrounds, editable output names, and zero-padded page numbers
  • Output preview before conversion: the first selected page now shows its expected pixel dimensions, approximate file size, page count, and render load with high-memory warnings and hard canvas limits
  • Scalable results: converted images are displayed 12 at a time with accurate dimensions and file sizes, contain-fit previews, accessible lightbox navigation, and focused retry controls for failed pages
  • Password-protected PDFs: users can enter or retry a PDF password in a bilingual, keyboard-accessible dialog instead of receiving a dead-end error
  • Better mobile saving: added iOS share support, split ZIP packages for large output sets, safe total-size thresholds, and mobile layouts that avoid horizontal overflow and floating-control collisions
  • More stable ZIP downloads: archive generation now streams files without wasteful image recompression and keeps download URLs alive long enough for browsers to save them reliably
  • Less silent local data: removed the hidden browser history that previously retained PDF filenames, file sizes, and preview thumbnails

Mic/Camera search intent cleanup: the existing tool and troubleshooting article now have clearer, complementary roles without changing either URL.

  • Tool intent preserved: the live Webcam & Mic Test remains focused on immediately checking a camera preview, microphone meter, and connected devices
  • Troubleshooting intent strengthened: the companion guide now leads with black-screen, silent-microphone, denied-permission, wrong-device, and Zoom/Teams/OBS conflict fixes for Chrome, Edge, Firefox, Safari, Windows, macOS, iOS, and Android
  • Accurate browser technology wording: clarified that the test uses MediaDevices.getUserMedia() for a local stream without creating a peer-to-peer call, recording media, or uploading the stream
  • Consistent discovery signals: synchronized the article title, description, Open Graph, Twitter Card, BlogPosting, FAQ, Breadcrumb, blog index card, sitemap date, and offline cache

Responsive crop reliability: the first production-audit fixes now keep crop geometry stable across desktop and mobile layouts.

  • Image Crop: preserved the selected source-image region when moving between desktop and mobile widths, eliminating the inverted scaling that enlarged or collapsed the crop box
  • Circle Crop: aligned the circle overlay and drag coordinates with the Canvas’s actual displayed size, so the selection remains centered, fully visible, and accurate after responsive resizing

Safer shared PDF workflows: expanded the patched PDF.js foundation to four more production tools while preserving their existing bilingual interfaces and output behavior.

  • Self-hosted PDF.js 4.10.38: upgraded Merge PDF, Compress PDF, PDF to Word, and AI to PNG from the older 3.11.174 runtime
  • Hardened document loading: disabled dynamic PDF JavaScript evaluation and standardized local Worker, character-map, and standard-font resources across all four workflows
  • Reduced third-party runtime risk: AI to PNG now loads JSZip directly from ToolKnit for multi-artboard ZIP downloads instead of depending on a public CDN, with the new PDF assets synchronized into the offline cache
  • Cleaner resource lifecycle: completed PDF documents are explicitly released after page counting, rendering, conversion, or reset to reduce memory retained during repeated use
  • Production regression coverage: verified a six-page merge, three-page compression, three-page Word export, three-artboard AI conversion, ZIP readiness, and 390 px mobile layouts without console errors or horizontal overflow

Background Remover first-run and memory hardening: rebuilt the AI setup path so new visitors can understand, defer, or start the model download without leaving the tool.

  • Same-page first-run setup: the AI model prompt now appears only when background removal is requested; choosing Not Now closes it cleanly, while Download & Continue resumes the pending image on the same page
  • Accurate download disclosure: synchronized the setup dialog, loading state, tips, FAQ, and structured data around the actual maximum of 109.5 MB for the model and WebAssembly resources
  • Pinned local AI engine: replaced the runtime CDN import with a self-hosted @imgly/background-removal 1.5.5 bundle and fixed local model path, reducing third-party availability and supply-chain risk
  • Memory-bounded refinement: replaced twenty full RGBA undo copies with one-channel mask snapshots governed by 12 MiB mobile and 32 MiB desktop budgets, with older states released automatically
  • Safer image limits: kept the 20 MB file cap and added decoded-image ceilings of 8 megapixels on constrained devices and 16 megapixels on desktop before AI processing begins
  • More compatible PNG saving: result downloads now use a short-lived document-backed link before it is removed, avoiding browsers that ignore clicks on detached download elements

HEIC and image orientation reliability: tightened two everyday image workflows around predictable output, bounded memory use, and accurate format guidance.

  • HEIC to JPG: added 20-file, 25 MB per-file, and 100 MB batch limits before decoding, plus device-aware pixel ceilings before decoded results are retained or displayed
  • Complete HEIC results: multi-frame files now preserve every decoded frame, mixed batches show explicit success and failure cards, previews release temporary URLs, and Download ZIP creates one predictable archive
  • Self-hosted HEIC decoder: pinned heic2any 0.0.4 locally and synchronized it with the offline cache instead of relying on a runtime CDN
  • Flip & Rotate Image: enforced the stated 50 MB limit plus device-aware decoded-pixel ceilings, rejected animated GIF instead of silently flattening it, and moved decoding away from base64 Data URLs
  • Accurate export behavior: PNG now preserves transparency and rendered pixels, while JPG uses a white background and 92% quality; metadata and animation limitations are clearly disclosed in both languages and structured data
  • Lower export memory: replaced base64 export with Blob generation, bounded temporary URL lifetimes, and released image and Canvas resources when starting over

Crop, merge, and silk-screen reliability: completed the next production-audit fixes across four image and PDF workflows.

  • Image Crop and Circle Crop: added the stated 50 MB limit, mobile and desktop decoded-pixel ceilings, visible damaged-image errors, safe empty-Blob handling, and an explicit warning that animated GIF exports keep only the first frame
  • Safer crop downloads: removed broken iOS-only variable references, kept native share support, allowed the same failed file to be selected again, and corrected mislabeled Popular Tools links in the Image Crop footer
  • Merge PDF validation: corrupted or encrypted PDFs are rejected before entering the file list, successful additions are counted per batch, and a merge that skips a file now reports partial completion with accurate success, failure, and page totals
  • Silk Screen HEIC support: connected the self-hosted HEIC decoder directly to the tool, added visible format, file-size, pixel, decode, and export errors, and kept all processing on the user’s device
  • Meaningful LPI controls: changed dot density to effective five-LPI steps with a continuous pixel-grid mapping, so adjacent low- and high-density settings now produce visibly different output
  • Responsive preview and protected export: controls render against a 1200 px preview for smoother adjustment, while PNG export re-renders from the original image at full size when safe and uses an explicit device-aware megapixel ceiling for larger files
  • Lower halftone memory: reduced channel masks from four bytes to one byte per pixel, tightened rotated-grid bounds, merged rapid slider events, and releases temporary full-size canvases after export
  • Site text integrity: completed a UTF-8 audit across all 215 HTML pages and restored truncated compression ranges and footer copy in Compress Image and JPG to PNG

Image-to-PDF and batch compression hardening: completed another production-audit pass across two high-use image workflows.

  • Real image validation: Image to PDF and Compress Image now reject damaged or unsupported files after an actual browser decode instead of accepting fake dimensions or failing later
  • Device-aware batch budgets: added per-file, file-count, total-byte, per-image pixel, and total-pixel limits before expensive Canvas or PDF work begins
  • Safe user filenames: removed filenames from dynamic HTML templates, added accessible remove and download labels, and guaranteed unique names for separate PDFs and ZIP entries
  • Honest compression results: files that become larger after re-encoding now keep their originals and display Original kept instead of a misleading negative or zero-percent saving
  • Transparency and animation protection: PNG alpha is checked across the entire image, while animated GIFs remain unchanged so no frames are silently discarded
  • Resilient mixed batches: one failed image no longer cancels every other compression result; completion feedback reports successful, unchanged, and failed files accurately
  • Local ZIP runtime: both tools now use ToolKnit’s pinned local JSZip 3.10.1 build, with cleaner Blob URL and Canvas lifecycles
  • Authority milestone: ToolKnit’s Ahrefs Domain Rating has reached 42, and the homepage badge now reflects the latest verified score

Homepage discovery redesign: rebuilt the first-screen tool discovery experience around faster scanning, clearer trust signals, and a calmer responsive layout.

  • Focused new hero: introduced concise everyday-work copy, a low-contrast animated workflow canvas, live tool and article totals, the verified Ahrefs DR 42 signal, and ToolKnit’s FMHY Multi Tool Sites recognition
  • Desktop category rail: moved category filtering into a fixed left-side text navigation aligned with the main content grid, using a restrained white selection marker and no decorative container
  • Context-aware navigation: the category rail follows users through the tool library, then gives way to an accessible back-to-top control before the How It Works section
  • Focused mobile category rail: replaced uneven multi-row controls with a single swipeable text rail that preserves each label’s natural width, centers the selected category automatically, and uses a quiet white underline instead of pills or button backgrounds
  • Bilingual mascot positioning: the spider now follows the tool-count label’s live position, preserving a consistent gap when English copy wraps, Chinese copy changes height, fonts finish loading, or the viewport is resized
  • New social sharing artwork: restored the missing shared Open Graph image with a new 1200 × 630 ToolKnit preview, so homepage, tool, blog, holiday, and supporting-page links can once again display a consistent branded card
  • Preserved production signals: retained the homepage URL, canonical, English SEO metadata, structured data, bilingual switching, light and dark themes, search behavior, all 91 tool cards, and existing analytics

Status and release-history consistency: corrected the public authority signal and made the long changelog easier to navigate.

  • Current authority rating: updated the Status page’s stale Ahrefs Domain Rating from 41 to the verified value of 42
  • Persistent timeline navigation: moved sticky positioning to the complete timeline sidebar, keeps the active date visible inside the list, and provides a fixed mobile date button with an overlay menu that does not shift the article

Homepage footer refinement: improved tool discovery and added a quiet personal signature without changing the surrounding category layout.

  • Seven rotating Popular Tools: the homepage footer now selects seven unique tools from the complete tool catalog on each visit, while retaining seven crawlable fallback links when JavaScript or the data request is unavailable
  • Bilingual creator credit: added a restrained heart signature below the X and GitHub links for “Made with love in China · Zihang Dong,” with a natural Chinese translation and matching light-mode styling
  • Verifiable FMHY recognition: added a bilingual trust note beneath the showcase badges that links directly to ToolKnit’s listing in FMHY’s Multi Tool Sites directory without overstating the relationship
  • Fast native sharing: added a responsive Share ToolKnit action that opens the device share sheet when supported, falls back to copying the canonical homepage link, and provides localized accessible feedback
  • Centered mobile Friends links: aligned the homepage’s wrapped footer partnership links with the centered copyright row, matching the established tool-page footer behavior on narrow screens

Six-format image conversion hardening: rebuilt the shared conversion core used by JPG, PNG, and WebP format tools around safer inputs, resilient batches, and predictable downloads.

  • Six tools upgraded together: hardened JPG to PNG, PNG to JPG, JPG to WebP, PNG to WebP, WebP to JPG, and WebP to PNG without changing their URLs, English SEO metadata, or bilingual architecture
  • Real format and decode validation: verifies JPG, PNG, and WebP file signatures, rejects disguised or damaged files, detects declared dimensions before full decoding when possible, and blocks device-unsafe pixel workloads
  • Bounded batch processing: enforces 20 files, 20 MB per file, device-aware total-byte limits, per-image pixel ceilings, and total decoded-pixel budgets before conversion
  • Resilient partial completion: one bad image no longer stops a valid batch; bilingual failure summaries identify each rejected file, while cancellation stops cleanly after the current image
  • Safer dynamic output: filenames now render only as text, duplicate output names receive deterministic suffixes, Canvas encoders must return a non-empty Blob with the requested MIME type, and ZIP contents are verified before download
  • Transparent PNG/WebP to JPG controls: users can choose white, black, or a custom background color instead of receiving an unexplained default, with controls translated live between English and Chinese
  • Animation and metadata clarity: animated WebP files are rejected before frames can be silently discarded, and both languages explain that Canvas output removes EXIF, GPS, ICC, and similar embedded metadata
  • Local, pinned ZIP runtime: all six pages now load ToolKnit’s self-hosted JSZip 3.10.1 build, while source, result, ZIP, image, and Canvas resources are released through explicit lifecycle cleanup

Image Resizer production hardening: strengthened the single-image resize workflow around validated inputs, predictable output, and clearer format behavior.

  • Real file validation: verifies JPG, PNG, WebP, BMP, and static GIF signatures, confirms the browser can decode the image, and rejects damaged files or animated GIF, PNG, and WebP assets before frames can be lost
  • Device-aware safety limits: enforces the stated 20 MB file cap, decoded-image pixel ceilings, 1–10,000 px dimensions, and bounded output-pixel workloads before creating a large Canvas
  • Transparent-to-JPG control: users can choose white, black, or a custom JPG background, while PNG preserves transparency and lossy-format quality controls stay disabled when they do not apply
  • Reliable output lifecycle: validates non-empty Canvas output and MIME type, releases replaced source and result URLs, clears large Canvas buffers, and uses safe source-derived filenames for downloads and iOS sharing
  • Accurate bilingual guidance: synchronized accepted formats, animation and metadata limitations, large-image expectations, validation feedback, responsive controls, and persisted-language mobile navigation in English and Chinese

Image Grid Split production hardening: rebuilt the fixed 3×3 workflow around exact pixel coverage, bounded memory use, and truthful output guidance.

  • Pixel-perfect tile coverage: distributes remainder pixels across the nine PNG tiles so every source pixel is included exactly once and neighboring tiles differ by no more than one pixel
  • Honest shape guidance: clearly warns when a non-square source will create rectangular tiles, links directly to Image Crop, and removes claims for custom grid sizes or equal square output that the tool does not provide
  • Real format validation: verifies JPG, PNG, WebP, BMP, and static GIF signatures and decoded dimensions, while rejecting damaged files and animated GIF, PNG, or WebP assets before frames can be lost
  • Device-aware safety limits: enforces the stated 20 MB file cap, decoded-pixel and dimension ceilings, minimum 3×3 input size, and mobile or desktop ZIP budgets before expensive work begins
  • Lightweight previews: replaces nine permanent full-resolution canvases and Data URLs with bounded 180 px Blob previews, preserving full resolution only when each numbered PNG tile is exported
  • Reliable local ZIP export: reuses one Canvas across all nine tiles, validates every PNG Blob and ZIP entry, uses the self-hosted JSZip 3.10.1 build, and releases temporary image, Canvas, and URL resources
  • Verified bilingual behavior: tested WebP input, reset and reselection, large-image preview, file limits, exact remainder sizing, ZIP completion, and 390 px English and Chinese layouts without tool errors

Word-to-PDF production hardening: completed the final page in the 22-tool PDF and image audit with safer DOCX validation, bounded rendering, and accurate output disclosure.

  • Truthful image-based output: title-adjacent guidance, workflow copy, FAQ, social metadata, and structured data now explain that each previewed page becomes an image in the PDF, so text, links, bookmarks, and accessibility structure are not retained
  • Real DOCX validation: enforces the stated 20 MB limit, verifies the ZIP signature and required Word package entries, rejects damaged or disguised files, and guards against excessive entry counts or expanded package sizes
  • Device-aware rendering budgets: limits pages, per-page pixels, total capture pixels, expanded document memory, and final PDF size, while reducing capture scale automatically for larger safe documents
  • Lower conversion memory: replaces per-page base64 Data URLs with validated JPEG Blobs and binary image data, releases each Canvas immediately after insertion, and removes off-screen rendering containers in success, failure, and cancellation paths
  • Reliable cancellation and recovery: users can stop long conversions between expensive stages, keep the validated preview, and retry without stale result state or leaked render resources
  • Pinned local conversion stack: Word to PDF now loads self-hosted JSZip 3.10.1, docx-preview 0.3.3, html2canvas 1.4.1, and jsPDF 2.5.1 builds instead of depending on three public CDNs at runtime
  • Production regression coverage: verified a two-page DOCX preview and conversion, damaged and oversized input rejection, a real 30-page cancellation, the 60-page desktop ceiling, and 390 px English and Chinese layouts without tool errors
Developer’s Note

If you’ve made it this far, you’re probably one of ToolKnit’s real regulars. This update is so long that I doubt many people will ever scroll all the way down here — so of course I had to leave a developer’s note at the bottom. Haha.

The last few days have been an intense sprint. Not just to ship more changes, but to make the small moments of using ToolKnit smoother, safer, and more dependable when you actually need it. I’ve put a huge amount of effort into this update, and I think it may be the longest one I’ve ever written. Still, it feels worthwhile: a lot of quiet details are now in a much better place.

Today’s homepage also received a careful UI refresh, and I genuinely love how it feels now. It’s clearer, calmer, and closer to the version of ToolKnit I’ve had in my head for a long time.

Please keep using ToolKnit whenever it can make a small task easier. Every visit, share, and piece of feedback helps this project keep moving.

The next update will likely take around half a week to a week. The pace lately has been a little too intense, and I also have another project to keep moving forward. But I’m still here, building with love. I’m excited for you to use what’s next — and I hope you’ll share ToolKnit with someone who could use it too.

Zihang Dong Jul 27, 2026 — a long update, a short pause, still building

Every Tool Page Now Runs on ToolKnit’s New Architecture

MILESTONE IMPROVEMENT DEV JOURNAL

After six weeks of careful, page-by-page work, ToolKnit’s entire tool collection has completed its migration to the shared modern architecture.

  • Migration complete: all 91 functional pages — 90 dedicated tools plus the World Holidays Hub — now use the new architecture
  • Preserved each tool’s core behavior and English SEO while adding consistent bilingual interfaces, responsive navigation, Related Tools, and the shared interactive footer
  • Completed the final Creative and Self-Test migrations, then brought the Holidays Hub into the same system
  • Reworked the Holidays Hub into a more compact responsive layout so users can scan countries, filters, and results with less vertical scrolling
  • Synchronized the tool and page sitemaps, llms.txt, deployment documentation, and Service Worker cache, then prepared the completed migration URLs for IndexNow
Developer’s Note

July 26, 2026. After a month and a half, I have finally migrated every ToolKnit tool page to the new architecture. Only I know how difficult this process has been. Looking back, I wish I had built the right foundation from the beginning instead of moving each page over one by one. Still, the ending is what matters: I did it.

Every new milestone brings a little happiness back to a heart that has been through a lot. At 22, I think I have done something worth being proud of.

I hope you enjoy using ToolKnit. Thank you for remembering this project, returning to it, and making the work feel worthwhile.

The pace has been intense lately, so I am taking a week off to look after my mind, my body, and my wallet. The next update will probably arrive about a week from now. P.S. Codex burns through its quota far too quickly!

The migration is complete, but a few pages may still have small bugs. We genuinely want to know about anything that gets in your way. If you find a bug or run into a problem, email me directly at 2645149786@qq.com. This is my personal inbox, and I will reply as quickly as I can.

Zihang Dong Jul 26, 2026 — every tool migrated, finally taking a breath

FMHY Recognition & Bilingual Migration Progress

MILESTONE IMPROVEMENT DEV JOURNAL

ToolKnit has been accepted into FMHY, the internet’s largest free-resource library, while the final legacy tool pages move rapidly toward the shared bilingual architecture.

  • FMHY listing: Multi Tool SitesToolKnit - Image / Video / PDF / Audio / File
  • Advanced the new-architecture migration to 83 of 91 functional pages, leaving 8 legacy pages across Creative and Self-Test
  • Completed the bilingual Creative-architecture migration for CPS Test, Random Spinner, and Color Picker, preserving their original functionality and English SEO
  • Standardized the three pages with bilingual FAQ content, Related Tools, the shared interactive footer, remembered language choice, and mobile-safe hero navigation
  • Fixed Color Picker’s mobile menu so tapping outside it closes the panel without shifting the page layout, then advanced the Service Worker cache to toolknit-v235
  • Prepared the next phase: finish the remaining migrations, then refine the UI and add small, focused functional improvements
Developer’s Note

July 25, 2026. We made it into FMHY, the internet’s largest free-resource library!

ToolKnit is now listed under Multi Tool Sites as ToolKnit - Image / Video / PDF / Audio / File. Seeing the project included there feels like a meaningful milestone, especially after all the quiet work that has gone into building and refining it.

Right now, I’m moving quickly through the remaining legacy tool pages. ToolKnit’s bilingual architecture is almost complete, and the last pieces are finally coming together.

Today’s batch brought CPS Test, Random Spinner, and Color Picker into the shared bilingual structure. The small mobile details matter too: Color Picker’s navigation now closes naturally when you tap outside it, and all three pages now carry the same footer and responsive behavior as the rest of the new architecture.

Over the next few days, I plan to finish the remaining migrations. Once that foundation is complete, the next phase will focus on polishing the UI and adding small, thoughtful functional improvements across the site.

Zihang Dong Jul 25, 2026 — listed by FMHY, finishing the bilingual migration

New Architecture Consistency, FAQ Coverage & Cache Cleanup

FIX IMPROVEMENT DEV JOURNAL

Completed a full consistency audit across all 66 bilingual tool pages and repaired the remaining gaps in the shared architecture.

  • Added visible bilingual FAQ sections to 8 tools and matching FAQPage structured data to 9 tools
  • Added safe-area viewport support to 33 migrated pages and removed 5 hidden legacy navigation blocks
  • Updated Lyric Visualizer to the standard footer grid, removed a duplicate Related Tools loader, and connected its full Chinese UI to the remembered language setting
  • Fixed a corrupted keyboard shortcut and invalid HTML tags in Emotional Neglect Test
  • Fixed malformed Metronome structured data and two broken bilingual registration contracts in AI to PNG and Compress Video
  • Fixed Compress PDF results for already-optimized files so the panel and download filename clearly show that the original file is being kept
  • Removed UTF-8 BOM headers from 25 pages, including duplicate markers on 15 pages, and restored two corrupted default tool icons
  • Completed public statistics display-name coverage for all 91 functional pages
  • Normalized titles and meta descriptions across all 211 indexed pages to the project’s SEO length targets, filled missing robots and Open Graph metadata, and corrected stale tool counts and malformed privacy structured data
  • Verified that all dedicated tool, blog, holiday, and core-page URLs are covered by the split sitemaps, and confirmed that llms.txt links to all 90 dedicated tool pages without broken local targets
  • Cleaned duplicate and obsolete Service Worker entries, verified every local precache target, synchronized document language metadata, and advanced the cache to toolknit-v224
Developer’s Note

July 23, 2026. It’s 11 PM, and my computer is running two projects at once. Even my games have started stuttering, which is probably my computer’s way of telling me to take a break. Haha.

I recently switched to a new IDE and started using Codex. Honestly, it’s the best coding setup I’ve used so far. My only complaint is the processing speed — it can be painfully slow sometimes — but it’s careful, thorough, and genuinely responsible about the work. For my workflow, it has been far better than Cursor, Windsurf, Trae, or Zcode. That’s saying a lot.

Somehow, I’ve burned through nearly 400 million tokens in just two days. At this rate, ToolKnit updates may slow down a little while I wait for Tibo to reset my Codex quota. Haha.

Still, the progress has been worth it. Most of the site’s hidden issues are now fixed, and I’ve rewritten the titles for most tools and pages. Hopefully the SEO gods notice and ToolKnit climbs a little higher.

The next update may land on July 26. Until then, take care, have fun, and I hope every day brings you something to be happy about.

Zihang Dong Jul 23, 2026 — two projects, 400 million tokens, still building

New Tool: Text to Speech — 69 AI Neural Voices, Server-Side Architecture

NEW

The Tool

Added Text to Speech — a free online TTS tool that converts text to natural speech using Microsoft Edge's neural voice service. No API key, no signup required. Just type, pick a voice, and hit generate.

Features

  • 69 neural voices across 19 languages (English, Chinese, Japanese, Korean, French, German, Spanish, Arabic, Hindi, Thai, Vietnamese, and more)
  • Adjustable rate, pitch, and volume with real-time slider controls
  • Voice preview — sample any voice before generating the full text
  • Language filter pills for quick voice browsing by language
  • MP3 download — save generated speech as an audio file
  • Automatic voice fallback — if a voice is unavailable, the server automatically retries with a known-good voice from the same language
  • Full bilingual support (EN/中文) with standard new-architecture template
  • SEO-optimized: HowTo schema, Use Cases section, Supported Languages section, enhanced meta tags, and noscript fallback

Technical Notes

  • Server-side architecture: Node.js TTS server using the msedge-tts package, running as a systemd service on port 3210
  • PHP proxy: /api/tts.php forwards requests to the Node.js server via cURL, keeping the API on the same origin
  • ttsController state machine: Centralized state management (idle → loading → playing → paused) with AbortController for cancellable requests and full resource cleanup on page unload
  • Voice fallback system: 27 locale-specific fallback voices tested and verified — if a requested voice fails, the server automatically retries with a known-good alternative from the same language
  • MP3 output: AUDIO_24KHZ_48KBITRATE_MONO_MP3 format for broad browser compatibility
  • Text length limit: 5,000 characters with live character counter and estimated duration
  • Memory-safe: Object URLs revoked on cleanup, audio paused and src cleared on page unload, all fetch requests abortable
Developer’s Note

July 21, 2026. Just got back from the trip.

It’s past midnight. One person, one cup of coffee, still at the desk. The trip was good — mountains, sea breeze, the kind of quiet that resets your brain. I took way too many photos. I’ll sort through the landscape shots the day after tomorrow and share some here.

Today’s update is a small one: a single new tool — Text to Speech. The architecture went through three iterations before I got it right. First attempt was browser-side WebSocket, which Microsoft blocked. Second attempt was a PHP WebSocket client, which also got 403’d. The final version runs a Node.js service with msedge-tts behind a PHP proxy, and it works. 69 real neural voices, each one sounding different, each one generated on the server and streamed back as MP3. I tested every single voice — all 69 pass.

Building solo means every decision goes through one filter: yours. There’s no team meeting to align with, no product manager to convince. Just you, the code, and the quiet hum of the server at 1 AM. Some days that’s liberating. Other days it’s heavy. Tonight it feels just right — a cup of coffee, a finished feature, and the satisfaction of hearing 69 different voices say “Hello world” back to you.

It’s too late to start anything bigger tonight. One small feature shipped, and that’s enough. Time to rest.

More coming soon. The roadmap is long, the coffee is warm, and the tools aren’t going to build themselves.

Zihang Dong Jul 21, 2026 — one person, one cup of coffee, still building

iOS Safari Download Fix, Newline Character Bug Fix & Chinese Search Support

FIX IMPROVEMENT DEV JOURNAL

The Problem

  • iOS Safari’s long-standing limitation: the browser ignores the download attribute on <a> tags pointing to blob: or data: URLs. Instead of triggering a file download, Safari opens the content in its built-in viewer — PDFs render in the PDF previewer, images open fullscreen, and videos launch the native player — with no obvious way for users to save the file to their device.
  • Android Chrome and desktop browsers were completely unaffected — downloads worked fine everywhere except iOS Safari, making this a silent bug that only iPhone/iPad users encountered.
  • The report came from a Douyin (TikTok) community member who pointed out that the Image-to-PDF tool could not download the generated PDF on their iPhone. That single report uncovered a site-wide pattern affecting 26 different tools.

The Fix

  • Implemented a unified dual-path download strategy across all affected tools: on iOS, interception uses the Web Share API (navigator.share()) to invoke the native iOS share sheet, where users can tap “Save to File”. On all other platforms, the existing <a download> behavior remains unchanged.
  • iOS detection uses a three-factor check: User-Agent (iPad|iPhone|iPod), navigator.platform, and navigator.maxTouchPoints — this correctly identifies iPadOS 13+ desktop-class Safari, which spoofs a Mac user-agent string.

Tools Fixed (26 Total)

PDF Tools (7)

  • Image to PDF, Compress PDF, Word to PDF, Merge PDF, Invoice Generator, Whiteboard (PNG + PDF export), Daily Planner (PNG + PDF export)

Image Tools (13)

  • Compress Image, Convert Image (all 6 format pages: JPG↔PNG↔WebP), Background Remover, Circle Crop, Flip Image, HEIC to JPG, AI to PNG, Image Crop, Signature Maker, Silk Screen, Ask Fate (share card), Chart Maker (PNG + JSON + HTML), Video Screenshot

Video & Audio Tools (6)

  • Compress Video, Text Animation Maker (WebM + MP4), Video to GIF, Video to Audio, MP3 to WAV, WAV to MP3

Infrastructure

  • All JS file version numbers bumped per-tool for cache-busting (e.g. compress-image.js?v=2 → v=3). Service Worker cache version advanced: v192 → v213 across the session.
  • Deployed incrementally tool by tool to minimize risk — each fix verified before moving to the next.

Newline Character Bug Fix

  • Full-site audit of all 90+ tool pages revealed 3 files with a stray `n character rendered in the page footer: Compress Image, Image to PDF, and What to Eat?.
  • The artifact appeared between the tracker.js and sound-effects.js script tags, likely a leftover from a batch editing operation.
  • All 3 files cleaned and verified — zero occurrences remain across the entire site.

Chinese Search Support

  • All 90 tools now support Chinese keyword search on the homepage. Each tool entry received a data-zh-keywords attribute with relevant Chinese search terms (e.g. "图片压缩, 压缩图片, jpg压缩").
  • Search logic updated to match against both English and Chinese keyword sets simultaneously, making the site fully bilingual-search capable.
  • SEO-safe implementation: Chinese keywords are stored in HTML data attributes only — not rendered in the UI — so the English-first page structure and SEO remain completely unaffected.

Noise Generator SEO & Feature Optimization

  • SEO overhaul: Title expanded to target long-tail keywords (sleep, focus, relaxation). Meta description and keyword list enriched with tinnitus, meditation, baby sleep, ADHD focus, and office privacy use-cases. Schema date bumped to 2026-07-19.
  • 3 new content sections added: "When to Use Each Noise Type" (7-card grid), "The Noise Color Spectrum Explained" (white/pink/brown scientific breakdown), and "Who Uses This" (5 user personas: remote workers, insomniacs, new parents, tinnitus sufferers, meditators).
  • FAQ expanded from 5 to 10 questions (tinnitus relief, brown vs white for sleep, baby safety, meditation, battery drain).
  • New structured data: FAQPage expanded to 10 items, new HowTo schema added for the 3-step guide.
  • Blog cross-link added below FAQ: "Read the Full Guide: Choosing the Best Noise for Sleep, Focus & Relaxation" pointing to blog/noise-generator.html.

Noise Generator Feature Upgrades

  • Real-time audio visualizer: Canvas-based frequency-bar animation connected to the AnalyserNode. Bars respond to the master output — subtle white bars on dark background with intensity-driven opacity. Appears below the Play button during playback, fades out when paused.
  • Custom sleep timer: New number input field accepts any value 1–480 minutes. Press Enter or blur the field to activate.
  • Save custom presets: "Save Current Mix" button stores the current slider/toggle configuration to localStorage. Saved presets appear as clickable buttons with delete (×) support. Persists across sessions.
  • Keyboard shortcuts: Keys 17 toggle individual channels. Space bar unchanged (Play/Pause). Both shortcuts avoid firing when focused on input fields.
  • State persistence: Volume levels, toggle states, and master volume are saved to localStorage and restored on page reload.
Developer’s Note

July 19, 2026. The site is still alive and kicking.

Today’s bug hunt started with a single message from a Douyin group member. They couldn’t download a generated PDF on their iPhone’s Safari browser — it just opened in the built-in PDF viewer with no download option. One report, and I ended up tracing the exact same issue across 26 different tools. That’s the thing about community feedback — one person’s small bug report can reveal a much bigger pattern you’d never catch on your own. I’m genuinely grateful for that message.

The fix is now deployed across the entire site. Every single tool that produces downloadable output — PDFs, images, videos, audio, ZIP archives — now works properly on iPhone and iPad Safari. The secret sauce is the Web Share API: on iOS, tapping the download button now brings up the native iOS share sheet. Just hit “Save to File” and you’re done. Android and desktop users won’t notice any difference at all — their experience stays exactly the same.

This afternoon I tackled two more issues: the newline character (`n) rendering bug and Chinese search support for the homepage. The `n artifact was a sneaky one — a batch operation gone wrong left literal backtick-n characters between script tags on 3 tool pages, rendering as visible text in the footer. A full-site audit caught them all. Chinese search was another long-overdue feature: all 90 tools now carry Chinese keywords in data attributes, so searching in Chinese finally works the way it should.

Finished the day with a substantial Noise Generator overhaul — the tool had good GSC exposure (avg position 68.2) but needed a push. Added three meaty content sections (noise type guide, color spectrum deep-dive, user personas), expanded FAQ from 5 to 10, layered in HowTo structured data, and shipped an audio visualizer, custom timer, preset saving, number-key shortcuts, and state persistence. The page went from a simple player to a proper guide + tool hybrid. Fingers crossed Google notices.

Tomorrow, I’m heading out on a trip. Time to unplug, decompress, and let the mind wander somewhere new. I’ll bring back photos to share here. I think I need this — the past few weeks have been intense, and stepping away from the screen for a bit feels necessary.

You might have noticed the update pace slowing down lately. That’s because I’ve been pouring energy into a new project: 4ai1.com — a multi-AI chat and workspace platform, still under active development. Once it’s ready, I’ll link it into the ToolKnit ecosystem. I’m also preparing ToolKnit’s desktop EXE tools for a full open-source release on GitHub. More on that soon.

To everyone who’s sent feedback, reported bugs, or just used the tools — thank you. ToolKnit is better because of you. If you notice anything off, please keep the reports coming. I read every single one.

That’s a wrap for July 19. Three bugs squashed, one new feature shipped. Off to pack for the trip now. See you all soon!

Zihang Dong Jul 19, 2026 — fixing bugs, one user report at a time

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. The Chinese text was replaced by four Unicode replacement symbols — 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 has now climbed from 29 to 42. 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.