Building a Privacy-First Resume Editor with Typst WASM and React The article describes SmartResume, a privacy-first resume builder that combines React with Typst compiled to WebAssembly to provide professional typesetting entirely within the browser. The application runs as a single-page app where all data is stored locally in IndexedDB, with compilation handled in a Web Worker to prevent UI blocking. The editor features a block-based interface similar to Notion, with both rich text and raw Typst source editing modes, and uses a message protocol with incrementing IDs to handle stale compilation results. The Problem Most online resume builders fall into two camps: - SaaS tools that upload your resume to a server for PDF generation — your most sensitive personal data leaves your machine. - LaTeX/Typst templates that produce great output but require a local toolchain, package manager, and CLI fluency. For non-technical users, option 2 is inaccessible. For privacy-conscious users, option 1 is unacceptable. SmartResume tries to solve both: professional typesetting quality, entirely in the browser. You can try it at resume.kakuti.site https://resume.kakuti.site/ . The source is on GitHub https://github.com/kakutixyz-ai/kakuti-resume . Architecture at a Glance ┌─────────────────────────────────────────────────┐ │ Browser SPA │ │ │ │ ┌──────────┐ ┌───────────┐ ┌─────────────┐ │ │ │ React │──▶│ Editor │──▶│ IndexedDB │ │ │ │ Pages │ │ State │ │ localforage │ │ │ └──────────┘ └───────────┘ └─────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────┐ │ │ │ Web Worker │ │ │ │ ┌────────────┐ │ │ │ │ │ Typst WASM │ │ │ │ │ │ Compiler + │ │ │ │ │ │ Renderer │ │ │ │ │ └────────────┘ │ │ │ └─────────────────┘ │ └─────────────────────────────────────────────────┘ │ ┌─────▼──────┐ │ Vercel │ │ /api/ │ ← Discord webhook │ feedback │ optional └────────────┘ The application is a single-page app React 18 + Vite 5 + TypeScript . There is one serverless function for optional feedback — everything else runs client-side. How Typst Runs in the Browser Typst is a modern typesetting language, like LaTeX but with a cleaner syntax and faster compilation. The key insight is that Typst's compiler and renderer can be compiled to WebAssembly via @myriaddreamin/typst.ts https://github.com/Myriad-Dreamin/typst.ts . Two WASM binaries handle the pipeline: | Binary | Purpose | Size | |---|---|---| typst ts web compiler bg.wasm | Parses .typ source, produces a document AST | ~8 MB | typst ts renderer bg.wasm | Renders the AST to PDF bytes and SVG elements | ~5 MB | Both run inside a Web Worker to avoid blocking the main thread. This is critical — Typst compilation can take 200-400ms even for a single-page resume, and you don't want that on the UI thread. Worker Initialization js // frontend/src/features/template-renderer/hooks/useTypstCompiler.ts const workerRef = useRef