DeepSeek Harness Remote
DeepSeek Harness Remote 可將手機或另一台電腦與你運行 DeepSeek Harness 的電腦安全連接,隨時隨地繼續你的工作,方便隨時查看進度並繼續工作。
AI 翻譯
尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗https://www.quicktoolsworld.com · Your everyday tools. One quick stop.
A fast, privacy-friendly website with six browser-based tools:
| Tool | Route |
|---|---|
| Word Counter | /word-counter |
| Image Compressor | /image-compressor |
| QR Code Generator | /qr-code-generator |
| Password Generator | /password-generator |
| Case Converter | /case-converter |
| Percentage Calculator | /percentage-calculator |
Plus /, /tools, /blog (with nine guides), /about, /contact, /privacy-policy, /terms, /disclaimer, a custom 404, /sitemap.xml, /robots.txt and /ads.txt.
Every tool runs entirely in the browser. There is no backend, database or account system, and user input is never uploaded.
Stack: Next.js 16 (App Router, Cache Components), React 19, TypeScript, Tailwind CSS 4, lucide-react (icons), qrcode (QR generation). Every page is prerendered as static HTML.
npm install
cp .env.example .env.local # then edit the values
npm run dev # http://localhost:3000
Checks:
npm run lint
npx tsc --noEmit
npm run build && npm run start
| What | Where |
|---|---|
| Brand name, wordmark split, tagline, social links, legal "last updated" date | lib/site.ts |
| Production domain | lib/site.ts (default https://www.quicktoolsworld.com), or override with NEXT_PUBLIC_SITE_URL |
| Contact email | lib/site.ts (default [email protected]), or override with NEXT_PUBLIC_CONTACT_EMAIL |
| Tool list, titles, descriptions, related tools | lib/tools.ts |
| AdSense | lib/ads.ts + NEXT_PUBLIC_ADSENSE_* variables |
| Design tokens (colors, shadows, radii), shared component styles | app/globals.css |
| Logo and favicon | components/layout/logo.tsx (mark + wordmark), app/icon.svg, app/apple-icon.tsx, app/favicon.ico |
To rename the brand, change name and wordmark in lib/site.ts. The logo mark is text-free, so it does not need to change. If you change its colors, update app/icon.svg to match and regenerate app/favicon.ico from it.
Social links are empty by default and the footer hides them. Add real profiles to socialLinks in lib/site.ts when they exist.
The copyright year in the footer updates itself in the browser. copyrightYear in lib/site.ts is only the fallback in the prebuilt HTML.
app/ Routes (one folder per page), sitemap, robots, ads.txt, icons, OG image
blog/ Blog listing and one folder per article
components/
blog/ Article layout, post card, tool callout
layout/ Header, footer, logo
tools/ Interactive tool UIs (client components)
ui/ Reusable pieces: FAQ, breadcrumbs, notices, copy button, ad slot…
tool-page.tsx Shared layout for every tool page
info-page.tsx Shared layout for About/legal pages
lib/
site.ts, ads.ts Central configuration
tools.ts Tool registry (names, titles, H1s, descriptions)
blog.ts Blog post registry (titles, dates, related tool)
metadata.ts Per-page SEO metadata helper
tools/*.ts Pure tool logic (no React), e.g. password.ts, percentage.ts
docs/seo-keyword-map.md SEO audit, keyword map and internal linking rules
lib/tools.ts and an icon to components/tool-icon.tsx.lib/tools/<name>.ts and the UI in components/tools/<name>.tsx.app/<slug>/page.tsx using <ToolPage> with real instructions, explanation and FAQs.The homepage, All Tools page, footer, mobile menu and sitemap update automatically.
The site works on any host that supports Next.js 16. The simplest option is Vercel:
npm run build) are correct.NEXT_PUBLIC_SITE_URL and NEXT_PUBLIC_CONTACT_EMAIL default to https://www.quicktoolsworld.com and [email protected].Other options: Netlify, Cloudflare (via OpenNext), or any Node.js server with npm run build && npm run start. Cache Components requires the Node.js runtime.
NEXT_PUBLIC_*values are built into the pages, so redeploy after changing them.
quicktoolsworld.com and www.quicktoolsworld.com. The live site uses www.quicktoolsworld.com as the primary domain, with quicktoolsworld.com redirecting to it. That is the address used in canonical URLs and the sitemap.A record for the apex domain and a CNAME for www). Wait for the host to show both as valid and for HTTPS certificates to be issued.https://quicktoolsworld.com, https://www.quicktoolsworld.com and http://quicktoolsworld.com and check that all three end up at https://www.quicktoolsworld.com.If you ever make the non-www address primary instead, set NEXT_PUBLIC_SITE_URL=https://quicktoolsworld.com and redeploy so canonical URLs match.
The Contact page has a form that sends messages to [email protected] through Brevo's transactional email API. The form posts to app/api/contact/route.ts, which runs on the server. The Brevo API key never reaches the browser.
Environment variables (server-only; add them to .env.local locally and to your host's environment settings in production):
| Variable | Required | Purpose |
|---|---|---|
BREVO_API_KEY | Yes | Brevo API v3 key (Brevo → SMTP & API → API keys) |
CONTACT_TO_EMAIL | No | Inbox that receives messages (default [email protected]) |
CONTACT_FROM_EMAIL | No | Sender address. It must be verified in Brevo (default [email protected]) |
CONTACT_FROM_NAME | No | Sender name (default "QuickToolsWorld Contact Form") |
Required one-time setup in Brevo. Without it, messages are not delivered:
quicktoolsworld.com. Brevo shows DNS records to add: a Brevo code TXT record, DKIM and DMARC.v=spf1 include:_spf.mail.hostinger.com include:spf.brevo.com ~all. Use the exact values Brevo shows you.[email protected] and clicking the verification link Brevo emails to that inbox. Authenticating the domain gives better deliverability.Until the sender is verified, the server refuses to send and the form shows an error pointing visitors to the email address. Brevo accepts API requests from unverified senders and rejects them afterwards, which would otherwise create false "sent" messages.
Spam protection: hidden honeypot field, minimum fill time (3 seconds), same-origin check, per-IP rate limit (5 messages per 10 minutes, kept in memory per server instance), duplicate-submission guard, and length limits. Messages are not stored by the site and their contents are never logged.
Hosting: the form needs a Node.js server (Vercel, Netlify or a Node host). A purely static export cannot run /api/contact.
Nobody can guarantee rankings or that Google will index every page, but these steps let you see what Google actually does with the site.
quicktoolsworld.com. This covers www and non-www, and http and https.TXT record. Add it to your DNS at the registrar, wait a few minutes, and select Verify.sitemap.xml and select Submit. The full address is https://www.quicktoolsworld.com/sitemap.xml, and it lists 23 pages: the homepage, all tools, the blog, the nine articles and the information pages.If you prefer a URL prefix property, you can verify with an HTML meta tag instead. Add the code Google gives you to the verification field of the metadata export in app/layout.tsx, for example verification: { google: "code-from-search-console" }. Never commit a made-up code.
Use URL inspection on these pages and select Request indexing for each one once:
https://www.quicktoolsworld.com/https://www.quicktoolsworld.com/tools and each tool page, such as /image-compressorhttps://www.quicktoolsworld.com/blog/blog/how-to-compress-images-onlineView tested page → Screenshot shows what Google's smartphone crawler sees. The headings, text and links should all be there without clicking anything.
| Report | What to look for | How often |
|---|---|---|
| Indexing → Pages | Pages listed as "Crawled – currently not indexed" or "Discovered – not indexed". New sites often take weeks. | Weekly at first |
| Performance → Search results | Queries, impressions, clicks, CTR and average position. Filter by page to see which queries each tool attracts. | Weekly |
| Experience → Core Web Vitals | LCP, INP and CLS from real Chrome users. It appears only once there is enough traffic. | Monthly |
| Enhancements | Breadcrumb structured data errors | After deploys |
| Security & Manual actions | Should say "No issues detected" | Monthly |
Google removed the separate Mobile Usability report in 2023. Use Lighthouse in Chrome DevTools or PageSpeed Insights to check mobile behavior.
docs/seo-keyword-map.md. Update titles, descriptions and on-page wording to match how people actually search, without stuffing keywords.The site has no analytics, and the Privacy Policy says so. If you add Google Analytics or another analytics tool:
app/layout.tsx. With Google tools, @next/third-parties/google is the simplest option.docs/seo-keyword-map.md holds the audit, the keyword map and the internal linking rules. docs/keyword-research.md holds the keyword research: autocomplete evidence for the US and Pakistan, priorities, and how to add real volumes from Keyword Planner./llms.txt: a plain-text summary of the tools and guides for AI assistants and answer engines, generated from lib/tools.ts and lib/blog.ts. This is an emerging convention, not a standard, and no answer engine is guaranteed to read it.robots.txt allows all crawlers, so the content is available to search engines and AI systems. If you'd rather block specific AI crawlers, such as GPTBot or CCBot, add rules in app/robots.ts. Google's AI features use the normal Googlebot.lib/tools.ts. Blog post details live in lib/blog.ts.lastModified comes from contentLastModified in lib/site.ts for the core pages, and from each post's updated date for articles. Change these only when content meaningfully changes.posts in lib/blog.ts with the title, description, dates, reading time and related tool.app/blog/<slug>/page.tsx. Copy an existing article: it uses ArticleLayout (breadcrumbs, byline, table of contents, structured data, related articles) and ToolCallout.h2 an id that matches the s object, so the table of contents links work.Articles are attributed to "QuickToolsWorld" (author in lib/site.ts). Name a person only if they really wrote or reviewed the article.
The articles in app/blog/ are complete, and their facts and calculations have been checked, but they deserve a human read-through before launch. If you publish on a different day, update published and updated in lib/blog.ts to the real date.
A short, practical plan. None of it guarantees rankings.
updated in lib/blog.ts when you do.Never: buy backlinks, use private blog networks, send automated mass outreach, post fake reviews, or trade links in bulk. These break Google's spam policies and can get the site removed from search results.
The AdSense script (adsbygoogle.js, publisher ca-pub-1544968719280843, set in lib/ads.ts) loads in the <head> of every page, together with the google-adsense-account meta tag and /ads.txt. Ad units are off until you enable them (Step 3), so no ad space is reserved. Note that if Auto ads are turned on in the AdSense dashboard, Google can place ads using the script alone. AdSense approval is decided by Google and is not guaranteed.
www.quicktoolsworld.com and check that canonical URLs and the sitemap use it.[email protected] exists and that someone reads it (set up the mailbox or forwarding with your domain or email provider). Send it a test email.lib/ads.ts; NEXT_PUBLIC_ADSENSE_CLIENT can override the ID). Each deploy includes:
<head> (the "AdSense code snippet" verification method),google-adsense-account meta tag, and/ads.txt containing google.com, pub-XXXXXXXXXXXXXXXX, DIRECT, f08c47fec0942fa0.NEXT_PUBLIC_ADSENSE_ENABLED=false during review.Google requires publishers that serve ads to users in the EEA, the UK and Switzerland to use a Google-certified consent management platform (CMP) integrated with the IAB TCF. A basic home-made cookie banner does not meet this requirement.
The simplest compliant option is Google's own CMP:
If you prefer a third-party certified CMP, load its script before the AdSense script in app/layout.tsx and follow its documentation.
data-ad-slot number.NEXT_PUBLIC_ADSENSE_ENABLED=true
NEXT_PUBLIC_ADSENSE_SLOT_TOOL_BELOW=1234567890
NEXT_PUBLIC_ADSENSE_SLOT_TOOL_FOOTER=0987654321
app/privacy-policy/page.tsx). Review that wording and update legalLastUpdated in lib/site.ts.Where ads appear: only on tool pages, below the finished tool and before the related-tools section, labelled "Advertisement" and separated by borders. They are never placed inside tool controls, next to download, copy or upload buttons, or beside calculator results. Keep it that way if you add placements, and avoid AdSense Auto ads unless you exclude tool areas. Never ask visitors to click ads.
lib/tools/password.ts must only use crypto.getRandomValues().mailto:). There is no server-side form, so visitors without a configured email app need to copy the address.