TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
Free online file converter for images, PDF, Word, Excel, audio, video, fonts and 3D models — converted in your browser in seconds. No upload, no account.
ProductivityHTML · JavaScriptGitHub @yogeshbistOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Convert Files — free file converter that runs entirely in your browser. convertfiles.in
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Convert Files — free file converter, nothing uploaded
Live at convertfiles.in — a free online file
converter and a set of file tools that run entirely in the browser. Nothing is
uploaded: the file is read, converted and downloaded on the visitor's own device.Read the full README ↗Live at convertfiles.in — a free online file converter and a set of file tools that run entirely in the browser. Nothing is uploaded: the file is read, converted and downloaded on the visitor's own device.
How it works technically: Canvas and WebCodecs for images, audio and video; pdf.js, pdf-lib and jsPDF for PDFs; Tesseract (WebAssembly) for OCR; hand-written encoders for GIF, BMP, ICO, WAV, TAR and glTF. No server touches a file.
Everything the public site needs is generated by one command from site.json:
python3 build.py
It stamps the AdSense / analytics tags into every page, versions the assets,
writes privacy.html, terms.html, contact.html, 404.html, one page per
popular conversion (/heic-to-jpg/), one per guide (/guides/<slug>/),
sitemap.xml, robots.txt, ads.txt and CNAME. Run it after any edit,
then commit and push — GitHub Pages publishes the main branch as-is.
site.json holds the only settings you should ever need to change:
| key | what it is |
|---|---|
domain | https://convertfiles.in — used for canonical URLs, the sitemap and CNAME |
contact_email | shown on the Contact page and in the legal pages |
adsense_client | your AdSense publisher ID, ca-pub-…; blank = no ads |
adsense_slots | optional ad-unit IDs for the result / home / article placements; blank = Auto ads only |
ga4_measurement_id | optional Google Analytics 4 id, G-…; blank = no analytics |
AdSense, step by step: sign up at adsense.google.com with the live domain
→ paste the ca-pub-… id into site.json → python3 build.py → commit and
push → click "Verify" in AdSense (the tag is now in every page's head and
ads.txt is published) → after approval, turn on Auto ads; if you also create
manual ad units, put their slot ids in adsense_slots.
DNS at your registrar (one-time): four A records on the apex
(@) pointing to 185.199.108.153, 185.199.109.153, 185.199.110.153,
185.199.111.153, and a CNAME record www → <your-github-user>.github.io.
Then in the GitHub repo → Settings → Pages tick "Enforce HTTPS" once the
certificate is issued (up to an hour after DNS propagates).
python3 tools/file-converter/serve.py
Then open http://localhost:8777. serve.py is the standard library server
with caching switched off, so edits show on a plain reload; python3 -m http.server 8777 --directory tools/file-converter works as well. (There is
also a .claude/launch.json entry named convert-files.) A plain file://
open mostly works too, but PDF rendering needs the page served over HTTP.
When a conversion finishes the result card appears in place, with a preview and a Download button; the same button sits on every card in Your files.
An internet connection is needed on first use: conversion libraries (pdf.js, jsPDF, SheetJS, JSZip, mammoth, marked, js-yaml, UTIF, lamejs) are pulled from CDN on demand and cached by the browser. Nothing else leaves the machine.
About 1,600 conversion pairs across 81 source formats in Chrome. The exact
number depends on the browser — at load the app probes for WebP encoding,
CompressionStream and the WebCodecs AAC/Opus/H.264/VP9 encoders, and removes
any target the browser cannot actually produce rather than offering an option
that is guaranteed to fail. The "Formats" tab lists the live graph.
Both format pickers are searchable: type an extension (docx), a format name
(spreadsheet) or a plain word (word, excel, photo, iphone,
quicktime). The From list shows how many targets each format has.
| Group | In | Out |
|---|---|---|
| Images | png jpg webp gif bmp avif jxl svg ico tif heic heif ppm pgm pbm | png jpg webp avif jxl bmp gif ico icns svg tif tga ppm pgm pbm · pdf · docx odt html epub rtf md (picture embedded) |
| Documents | txt log md html docx odt rtf pdf epub | txt md html pdf docx odt rtf epub tex · png jpg webp (page renders) |
| Spreadsheets | xlsx xls xlsm xlsb ods fods csv tsv dif dbf prn slk | xlsx xls xlsm xlsb ods fods csv tsv dif dbf prn slk html rtf · pdf docx odt epub tex (real tables) · json jsonl yaml xml toml sql md txt |
| Data | json jsonl ndjson yaml yml xml toml | json jsonl yaml xml toml sql · every spreadsheet format · txt md html pdf docx odt tex |
| Audio | mp3 wav m4a aac ogg oga opus flac weba aiff | wav mp3 m4a aac ogg opus |
| Video | mp4 m4v webm mov ogv | mp4 (H.264 + AAC) · webm (VP9 + Opus) — a real re-encode · gif · png jpg webp avif jxl bmp tga (single frame) · wav mp3 m4a aac ogg opus (audio track) |
| Archives | zip tar gz tgz | zip tar gz tgz |
| 3D / AR | obj stl ply gltf glb | obj stl ply gltf glb |
| Fonts | ttf otf woff | woff · ttf otf |
| Anything else | any file | zip tar gz tgz |
Every document pair goes through one shared model (js/docmodel.js) that
carries headings, bold/italic runs, links, lists, quotes, code, tables and
embedded images, so a Word file with a picture and a table still has both
after becoming PDF, ODT, EPUB, RTF or HTML.
Audio and video re-encoding use the browser's own WebCodecs encoders; the
containers are written by mp4-muxer / webm-muxer, except Ogg Opus, ADTS,
WOFF, GIF, BMP, TGA, ICNS, Netpbm and TAR, which are written by hand in
js/encoders.js and js/convert.js.
Set per family in js/formats.js, sized for what a browser tab can hold:
images 80 MB, documents 60 MB, spreadsheets 60 MB, data 120 MB, audio 250 MB,
3D 250 MB, fonts 40 MB, video 600 MB, archives 800 MB. Video re-encoding is
additionally limited to 15 minutes of footage, and output is capped at 1920 px
wide unless a width is set. The picker shows the cap and blocks anything over
it.
<video> element and
re-encoded by WebCodecs; a ten-minute clip takes a few minutes. Keep the tab
open — Chrome suspends video decoding in background tabs..ai, .psd, .sketch and friends are not inputs. They are proprietary
containers with no browser decoder.Pick as many files as you like (drop, browse, or "Add more"). With one file the From tile can be overridden; with several, each file keeps its own type and the To list is the intersection of what every type can become (mixed PNG + MD
On phones (coarse pointer) the wording switches to "Choose files", a sticky Convert bar follows the page once files are chosen, and the format picker opens as a bottom sheet.
Below the converter the home page carries the editorial material a public site
needs, all rendered from js/content.js in the same visual system:
GET /public on the analytics API, cached a minute at the
edge, with this device's share as the subtitle), and "0 files uploaded". If
the API cannot be reached the tile falls back to this device's own count.#guide:<slug>; the list is #guides.assets/upi-qr.png, cleaned to pure
black/white so it scans and weighs 1.3 KB), the UPI ID with a Copy button,
and on phones an "Open in UPI app" button (upi://pay deep link). After a
conversion the result card carries a quiet "Leave a tip" link. Below it sits a
single sponsor slot: fill SPONSOR in js/content.js (name, url,
tagline) and it renders "Sponsored by …"; leave it empty and it shows the
open slot. SUPPORT.upiId / payeeName / qr live in the same file.There is no sign-in, sign-up, pricing or account anywhere; the site is free and public by design.
content/ plus site.json; "Save &
publish" commits through the API and the site rebuilds itself (GitHub
Actions, about a minute).
Countries and states/regions come from what Cloudflare resolves at its edge
(the IP is never read or stored, only a daily count per place), and average
time on the site from the seconds each page was actually visible.https://convertfiles-api.convertfiles.workers.dev. It stores daily
counters only (see api/schema.sql): no files, no names, no IPs, no
identifiers. The site sends a view event on page load and a convert /
fail event after a conversion, and skips both when the browser sends Do Not
Track. Deploy with api/deploy.sh; secrets with api/set-secrets.sh.flutter build apk --release --split-per-abi.Every conversion is kept in the browser (IndexedDB database format-bench — the
internal name is unchanged so files converted earlier stay visible — store
conversions, keyed by an auto-increment id, indexed on createdAt and
targetExt; each record holds the output Blob plus name, source, sizes,
MIME type, timing, options and timestamp).
The Your files tab shows them as a gallery — a thumbnail for images, a
format badge for everything else — with Download and Delete on every card, a
search box, and the browser's storage usage. Clicking any card opens a preview
inside the page (browsers block window.open on blob URLs, so a new tab is not
an option): images, PDF, audio, video and text formats render directly, and
formats with no browser viewer — Word, Excel, ODT, EPUB, RTF — are rendered by
converting them to HTML in memory with the same engine, shown in a sandboxed
frame. Anything genuinely unviewable says so and offers Download. The raw record is deliberately not shown in the UI; open the
browser's DevTools → Application → IndexedDB if you ever need to see it.
site.json domain, contact email, AdSense and analytics ids
build.py generates the production pages (see "Going live")
pages/ templates for the legal pages
index.html markup, option controls, the format picker
serve.py local dev server (no-cache headers)
css/app.css theme tokens, light and dark
js/formats.js extension metadata, family size caps, lazy CDN loader
js/encoders.js hand-written binary writers: GIF (median cut + LZW), BMP, ICO, ICNS, TGA, Netpbm, WAV, TAR, Ogg Opus
js/docmodel.js the shared document model: 8 parsers, 9 writers, images and tables
js/convert.js the conversion graph, one rule per from-set -> to-set
js/db.js IndexedDB wrapper
js/content.js popular conversions, guides, FAQ and about copy
js/app.js UI
test/run.sh headless tests
tools/file-converter/test/run.sh
145 checks covering the parts no library provides: the GIF encoder is verified
by decoding its own output with an independent LZW decoder (exact round trip on
indexed colour, bounded error on gradients, animation delays, the NETSCAPE loop
block, transparency), plus BMP row padding and alpha compositing, WAV headers
and sample scaling, TAR checksums and round trips, OBJ/STL/PLY parsing and
writing, glTF building and parsing (including node transforms), GLB packing,
Ogg page CRCs and lacing, TGA/Netpbm/ICNS layout, the SQL writer and the
sfnt/WOFF table directory. Runs on macOS JavaScriptCore via osascript,
so it needs no node or npm.