A typewriter-themed Progressive Web App for distraction-free writing — rich text formatting, images, tables, real pagination, and Word/PDF/Markdown export. 100% client-side: no accounts, no server, no tracking.
- Rich text: bold, italic, underline, strikethrough, headings, alignment, lists, links
- Images with resize handles and a built-in crop tool
- Tables (click-and-drag grid insert)
- Real pagination measured from actual rendered content
- Export to .docx (real Office Open XML), .pdf (via print), .txt, .md, .html
- 12 themes, configurable page background (ruled/grid/dots/blank), adjustable font/size/line-height
- Typing sound schemes, including a soothing "Calm" preset
- Focus mode with an auto-hiding header
- Installable offline PWA — everything is stored in the browser via
localStorage
.
├── index.html # App shell and markup
├── app.js # All application logic (editor, pagination, export, settings, audio)
├── style.css # Styling and themes
├── sw.js # Service worker (offline caching)
├── manifest.json # PWA manifest
├── icon.png # App icon (512×512, used for all manifest sizes)
└── README.md
There is no build step and no dependencies — it's plain HTML/CSS/JS that runs directly in a browser.
Because the app registers a service worker and fetches its own manifest/icons, open it through a local HTTP server rather than as a file:// URL:
# from the project folder
python3 -m http.server 8000
# then open http://localhost:8000Any static file server works (npx serve, VS Code's Live Server, etc.) — the app itself needs no build/compile step, so refreshing the browser after an edit is enough.
- Relative paths:
manifest.json,sw.js, andicon.pngare referenced with relative paths (./), so the app works whether it's served from the repo root or a subpath like/repo-name/— no changes needed. - HTTPS: GitHub Pages serves over HTTPS by default, which is required for the service worker (PWA install/offline support) to register.
- Updating after changes: the service worker caches app files by version (see
CACHE_NAMEinsw.js). If you editapp.js/style.css/index.htmland don't see changes reflected for returning visitors, bump the version string insw.js— this forces the old cache to be replaced. - Custom domain: optional — add a
CNAMEfile to the repo root with your domain, and configure the DNS records GitHub's Pages docs specify.
Since this is a static site, it can be hosted anywhere that serves static files: Netlify, Vercel, Cloudflare Pages, an S3 bucket, or your own web server. Just upload all files at the same directory level (don't separate index.html from app.js/style.css/sw.js/manifest.json/icon.png — they reference each other with relative paths) and serve over HTTPS if you want installable/offline PWA support.
Works in current versions of Chrome, Edge, Firefox, and Safari. PWA install prompts and offline support depend on the browser's service worker support (all major desktop and mobile browsers support this today).
Everything — documents, settings, stats — is stored locally in the browser via localStorage. Nothing is sent to a server, because there is no server. Clearing your browser's site data for this app will erase saved documents, so use the built-in Export All (JSON) option in Settings → Data if you want a backup.
Developer: Tasmon Islam | Email: tasmon@outlook.com