Lattice
연구를 위한 작업공간
브라우저에서 PDF·Word·PowerPoint·Excel 등을 깔끔한 Markdown으로 변환하고 파일은 로컬에 남깁니다
Convert PDF, Word, PowerPoint, Excel and more into clean, structured Markdown, right in your browser. Files never leave your device.
생산성JavaScript · HTMLGitHub @GrowingRui온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.