A minimal, distraction-free desktop writing app, offline-first, no accounts, no subscriptions.
Cross-platform (Linux · macOS · Windows) desktop app built with Tauri + React + TypeScript, with a native Rust backend for local file storage and audio playback.
writeSimply is a lightweight desktop writing environment for people who just want to write. Notes live on your machine as local files, it works fully offline, opens instantly, and stays out of your way.
Because it's built on Tauri, the app ships as a small native binary
Loved by the community: 43+ GitHub stars and support from real users through Buy Me a Coffee.
- Distraction-free rich-text editor — built on Meta's Lexical with a custom toolbar (bold, italic, and more)
- Local file tree — organise writing into folders and notes, stored as JSON on disk
- Fully offline — no account, no cloud, no telemetry; your writing never leaves your machine
- Customisation — font family, font size, and theme (with an animated theme toggler)
- Writing timer — simple session timer to keep you focused
- Built-in music player — play local audio while you write, powered natively by the Rust backend
- Smooth UX — intro animation and motion transitions
- Cross-platform — one codebase for Linux, macOS, and Windows
| Layer | Technology |
|---|---|
| Desktop shell | Tauri 2 |
| Native backend | Rust (serde, serde_json, std::fs, std::process) |
| Frontend | React 19, TypeScript, Vite 7 |
| Editor | Lexical (@lexical/react) |
| Styling | Tailwind CSS 4, Radix UI, class-variance-authority |
| Animation | Motion (Framer Motion) |
| Testing | Vitest |
Design highlights
- Typed IPC contract — a shared
WritingFilestruct (name, text, font, font size, theme) is serialised withserdeon the Rust side and mirrored in TypeScript, so data crosses the boundary type-safely. - Local persistence — notes are written as JSON into the platform-specific app data directory; folders map directly to real directories, and
list_fileswalks them recursively. - Native audio with shared state — playback shells out to the platform's native player (
ffplayon Linux,afplayon macOS, PowerShell on Windows) selected via#[cfg(target_os = ...)]. The current process is tracked behind aMutex<AudioState>so play/stop/is-playing stay consistent across calls.
- Bun or Node.js + npm
- Rust toolchain (for Tauri)
- Tauri system dependencies for your OS — see the Tauri prerequisites guide
- Linux only:
ffmpeg(providesffplay) for the music player
git clone https://github.com/Khizarshah01/writeSimply.git
cd writeSimply
# install frontend deps
npm install
# run the app in dev mode
npm run tauri devnpm run tauri buildThe packaged installer/binary is emitted under src-tauri/target/release/.
Ideas and PRs are welcome, if there's a feature that would help other writers, open an issue or a pull request.
If writeSimply helps you write, you can support development here:
See LICENSE.

