尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗MarkFlow is a website that turns PDFs, Office documents, web pages and other files into clean, structured Markdown. You drop in a file and get back Markdown with the headings, lists and tables intact, ready for your docs, a Git repository or an AI agent.
Conversion runs entirely in your browser. Files are never uploaded: the converters, the OCR engine and the fonts are all served from the site itself, so your documents stay on your device.
Copying text out of a PDF or a slide deck breaks it: lines split mid-sentence, bullets turn into stray symbols, and tables collapse into one row of numbers. Markdown keeps the structure as plain text that people, Git and AI tools can all read.
.md file, or download every result together as a ZIP.| Format | Output |
|---|---|
PDF (.pdf) | Headings ranked by font size, bold and italic, lists and paragraphs. Multi-column pages are read in order, paragraphs are joined across page breaks, and running headers, footers and page numbers are dropped. Tables are rebuilt from ruled lines and aligned columns. Scanned pages are read with OCR. |
Word (.docx) | Headings, lists, links and tables. Equations become LaTeX ($…$). |
PowerPoint (.pptx) | A section per slide with its title, bullets and numbering at their original indent, tables, chart data, picture alt text and speaker notes. |
Excel and CSV (.xlsx, .xls, .csv) | A Markdown table for each sheet. CSV files saved in other encodings (such as GBK or Shift-JIS) are detected and decoded. |
Web pages (.html, .htm) | The page content, without scripts and styles. |
Jupyter (.ipynb) | Text cells as Markdown; code and outputs as code blocks. |
JSON and XML (.json, .xml) | Formatted code blocks. RSS and Atom feeds become a list of posts with links, dates and text. |
EPUB (.epub) | Every chapter, in reading order. |
ZIP (.zip) | Each file inside converted, one section per file. |
Images (.png, .jpg, .jpeg, .webp) | The text in the image, read with OCR, including tables, headings and lists. |
Output is GitHub-flavored Markdown, which works in most editors, documentation tools and Git hosts.
Requires Node 20 or later.
npm install
npm run dev # http://localhost:3000, with the API on /api
npm test # converter tests
npm run build # production build in dist/
npm run preview # serve dist/ on http://localhost:3000
| Path | What it is |
|---|---|
index.html | Page markup |
src/main.js | Entry point: fonts, styles, UI setup |
src/styles.css | Page styles and Tailwind layers |
src/ui/ | Converter panel, result panel, FAQ, language menu |
src/convert/ | One module per format. index.js picks the converter and loads it on demand |
src/ui/account.js | Sign-in dialog, account menu, daily limit |
server/ | API handlers, auth, database access. plans.js holds the limits |
api/ | Vercel Function entry points, one per route |
tests/ | Vitest tests; __snapshots__/ holds the expected Markdown for each fixture |
scripts/make-fixtures.mjs | Builds the sample files in tests/fixtures/ |
scripts/make-fixtures.mjs if the change needs one, then run npm run fixtures.npm test. If the output changed on purpose, review the diff in tests/__snapshots__/ and accept it with npx vitest run -u.npm run real-docs downloads public test files into real-docs/, and with npm run dev running, npm run real-docs:convert converts them into real-docs/out/.Text recognition uses Tesseract.js with English data. vite.config.js copies the worker, the WebAssembly core and eng.traineddata.gz from node_modules into tesseract/ at build time, so OCR works without a CDN.
Conversion runs in the browser, so the server only counts finished conversions and the page enforces the limit (see server/plans.js). Without the API (a plain static host), the page hides sign-in and converts without limits.
| Route | What it does |
|---|---|
POST /api/signup, POST /api/signin | Email and password. Passwords are hashed with scrypt; sessions are an HttpOnly cookie |
POST /api/signout | Ends the session |
GET /api/me | Who is signed in, and today's usage |
POST /api/usage | Counts one conversion |
Locally the API uses PGlite, an embedded Postgres stored in .data/. Delete that folder to start over.
DATABASE_URL=... npm run db:migrate once.api/ into functions.DATABASE_URL and SESSION_SECRET (any long random string) in the project's environment variables.