OpenWriter is a local-first, WYSIWYG book editor built for long-form writing and book production workflows. It includes chapter editing with page-accurate layout, a dedicated cover editor, a table-of-contents editor, and an editorial black-and-white interface designed for book creation.
- WYSIWYG book pages with trim size presets, margins, pagination, and page separators.
- Cover editor with title, subtitle, author, and visual styling controls.
- Table of contents editor with chapter references and page indicators.
- Chapter-based writing workspace with sidebar navigation and organization tools.
- Landing page focused on book publishing UX, including FAQ and step-based guidance with structured data.
- Local-first storage using IndexedDB (Dexie), so drafts stay on-device by default.
- Framework: Next.js 16 (App Router)
- UI: React 19, Tailwind CSS 4
- Editor: TipTap 3
- Local data: Dexie / IndexedDB
- Testing: Playwright, ESLint, TypeScript
- Node.js 20+
- npm 10+
npm installnpm run devOpen http://localhost:3000 in your browser.
| Script | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Build production bundle |
npm run start |
Run production server |
npm run lint |
Run ESLint |
npx playwright test e2e/book-editor.spec.ts |
Run E2E test suite |
app/ Next.js app entry points and routes
components/ UI and editor components
hooks/ Zustand/Dexie-related hooks and state adapters
lib/ Shared types, utilities, and data helpers
e2e/ End-to-end tests (Playwright)
public/ Static assets
OpenWriter follows Semantic Versioning.
Current release: 1.0.0
Contributions are welcome.
- Fork the repository.
- Create a feature branch.
- Make focused, well-tested changes.
- Open a pull request with context and screenshots for UI changes.
Please keep changes aligned with the existing editor UX and code style.
- Drafts are stored locally in the browser by default.
- Do not commit secrets or credentials.
- If you discover a security issue, report it privately to the maintainers before public disclosure.
Licensed under the Apache License 2.0. See LICENSE.