Merge PDF Major Upgrade — Page Selector, Custom Filename, Homepage Light Mode Fixes & New Blog
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).
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.