DeepSeek Harness Remote
DeepSeek Harness Remote 可將手機或另一台電腦與你運行 DeepSeek Harness 的電腦安全連接,隨時隨地繼續你的工作,方便隨時查看進度並繼續工作。
AI 翻譯
尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
Free, browser-only file toolbox: 38 tools for PDF, Office, images, video, audio and QR codes. Files never leave your device; pdf.js, qpdf (WebAssembly), pdf-lib and WebCodecs do the work locally. Bilingual EN/ID, embeddable, MIT.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗English · Bahasa Indonesia
My everyday file toolbox, built for the file work I do every day and published free for everyone. 72 tools for PDF, Office files, images, video, audio and QR codes, and every one of them runs entirely in your browser. Your files are never uploaded.
▶ Watch the 16-second launch video with sound · Bahasa Indonesia version
Most "free online converters" upload your file to someone else's server. For a contract, a payslip or an ID scan, that is a bad trade. This site makes one promise and is built around it: everything happens on your device. There is no backend, no account, no upload and no third-party processing API. Heavy work is done with libraries compiled to WebAssembly or with the browser's own media encoders, and a library is downloaded only when you open the tool that needs it.
All 45, grouped the way the home page groups them. Each name links to the live tool.
To PDF
.docx to PDF, paginated without cutting through lines of text.pptx to PDF, one page per slide.xlsx/.csv to a selectable-text PDF table, with theme colors, borders, merged cells and number formatsFrom PDF
.docx, keeping font size, bold/italic, tabs and page breaksEdit & Secure PDF
1-3, 5, 8-, or every N pages)1, 1 / 10, Page 1) and the first numbered pageImages & Media
Music
Developer & Design
.ico, iOS/Android icons, web manifest and the <head> snippetProductivity
eval)crypto.getRandomValues, plus a strength check with estimated guessing timeDeviceOrientationEvent (iOS permission, calibration warning)islamic-umalqura Intl calendar, plus a year of Islamic holidays; notes that official Kemenag dates may differ by a dayThe Indonesian README has a longer per-tool table with every option and limitation.
src/
├── tools/
│ ├── registry.ts one entry per tool: slug, category, icon, keywords, lazy(() => import(...))
│ ├── registry-en.ts English titles and descriptions
│ └── <slug>/ one folder per tool, default-exported React component
├── lib/ shared engines: pdf-text, pdf-doc, qpdf, media, image, i18n, routing
└── components/
├── tool/ shared tool UI: FileDrop, MediaRange, SizeResult, ...
packages/screen-recorder/ the same tool source built as an npm package / web component
#/<slug> route are all derived from the
registry. Each tool is React.lazy-loaded, and heavy libraries (pdf.js, ExcelJS, Mediabunny…)
are dynamic import()s inside the tool, so the home page never pays for them.lib/pdf-text.ts) feeds PDF to
Word, Excel, PowerPoint and Markdown; PDF editing (lib/pdf-doc.ts, pdf-lib) handles rotated
pages and restriction-only encryption for merge, split, watermark and sign; all audio/video goes
through lib/media.ts on Mediabunny..wasm bundled by Vite instead of fetched from a CDN. MP3 and AAC encoders are wasm
fallbacks registered only when the browser has no native encoder./tools/. Routes are #/<slug> so a reload on GitHub Pages' sub-path never
404s and no server rewrite is needed./ to
search) grouped by category. No animation library and no per-frame JavaScript, so it opens fast
even on a phone.t('Indonesian', 'English')). English is the default unless the browser language is Indonesian
or Malay; ?lang=en in a link forces it.More detail, including how the npm package isolates its styles in a Shadow DOM, is in docs/ARCHITECTURE.md.
| Area | Libraries |
|---|---|
| App | React 19, TypeScript 6, Vite 8, Tailwind CSS v4, shadcn/ui, lucide-react, Geist font |
| pdf.js (legacy build), pdf-lib, qpdf (wasm), jsPDF + jspdf-autotable | |
| Office | docx-preview, docx, ExcelJS + numfmt, pptxgenjs, @jvmr/pptx-to-html, html2canvas-pro, DOMPurify |
| Audio / video | Mediabunny on WebCodecs, @mediabunny/aac-encoder and mp3-encoder (wasm), gifenc, gifuct-js |
| Images / QR | Canvas 2D, zxing-wasm, node-qrcode |
| Music | Web Audio API only — pitch, tempo and key detection and the chord shapes are written in-house |
| Other | marked + DOMPurify (Notes), perfect-freehand (Whiteboard), JSZip |
Requires Node.js 22 (the version CI uses).
npm ci
npm run dev # dev server
npm run build # type-check (tsc -b) + production build
npm run preview # serve the production build
npm run lint # oxlint
npm run build:packages # build the embeddable npm package(s)
npm run og # re-render the Open Graph image (needs Chrome/Chromium)
A local build uses base /. To reproduce the GitHub Pages build exactly:
npx tsc -b && npx vite build --base=/tools/ && npx vite preview --base=/tools/
Every push to main is built and deployed to GitHub Pages by
.github/workflows/pages.yml.
src/tools/<slug>/ with a default-exported component. Reuse the shared UI in
src/components/tool/ and keep heavy libraries behind a dynamic import().src/tools/registry.ts (category, icon, formats, search keywords, lazy import)
and its English text to src/tools/registry-en.ts.The one rule: all processing stays on the client. No backend, and no sending user files to a third-party service.
npm run build is the gate. It runs tsc -b (strict TypeScript) before vite build, and CI
runs the same type-check before every deploy, so a type error never ships.npm run lint).packages/screen-recorder/types/check.ts).VideoEncoder/AudioEncoder first
and names the browsers that support them when they are missing. AAC falls back to a wasm
encoder where the browser has none (Firefox, Chrome on Linux); MP3 always uses the wasm encoder.getDisplayMedia); it records VP9/Opus WebM, or MP4
on Safari, and can convert WebM to MP4.Known limitations, also stated in each tool: scanned PDFs are not supported (that needs OCR);
legacy .doc, .ppt and .xls are not supported; Excel to PDF and Watermark PDF write text with
PDF's built-in Helvetica, so non-Latin scripts do not render correctly.
Any tool can be embedded. ?embed renders the tool alone, without the site header and footer;
add &theme=light|dark and &lang=en|id as needed.
<iframe
src="https://chalidade.github.io/tools/#/screen-recorder?embed&lang=en"
title="Screen Recorder"
style="width: 100%; height: 760px; border: 0; border-radius: 16px"
allow="display-capture; microphone; camera; clipboard-write; fullscreen; picture-in-picture"
></iframe>
packages/screen-recorder builds the Screen Recorder from the same
source into a <screen-recorder> custom element (React and CSS bundled, rendered in a Shadow DOM)
plus a headless API. It is ready to publish to npm as @chalidade/screen-recorder but has not been
published yet; until then, use the iframe.
Things this project taught me, with the longer write-ups on my devlog:
Range.getClientRects() and moves the cut into a gap; margins
moved to @page so continuation pages keep them.http(s), mailto, tel and sms links clickable, and a crafted-.docx XSS in Word to
PDF (docx-preview rendering embedded HTML in an unsandboxed iframe) was fixed in
68db1ae.Built with Claude Code as the coding assistant. I decided what to build and where to draw the scope lines, reviewed and merged every change, and tested the tools on real files and on the outputs they produce.
MIT © Chalid Ade Rahman · chalidade.github.io
wa.me chat link, copy button and QR (reuses the QR generator); the number is remembered only if you askcrypto.getRandomValues, up to 1000 at once, with format options