Human Typer is a lightweight desktop utility that types text character by character into the active field of another application. Its base speed, random timing variation, punctuation pauses, and optional self-corrected typing mistakes are configurable, producing a natural cadence.
It is built with Tauri 2, React 19, TypeScript, and Rust. Everything runs locally on your device: there is no server, account, telemetry, or permanent storage of your text.
Only use automation in applications and fields where you are authorized to do so. Press
Escto stop typing from any application.
- Types every character individually instead of pasting the whole text.
- Imports the first worksheet of a local
.xlsxor.csvfile and fills the foreground spreadsheet cell by cell. - Supports Unicode, accented characters,
ñ,¿,¡, symbols, spaces, tabs, and line breaks. - Includes predefined speeds and fine-grained adjustment from 15 to 350 ms.
- Adds random timing variation and subtle natural fluctuations.
- Supports optional pauses after
. , ; : ? !and line breaks. - Can occasionally press a nearby letter, erase it, and immediately type the intended letter.
- Can lock onto the target window and pause automatically if focus moves elsewhere on macOS or Windows.
- Includes a bundled Chrome, Edge, and Firefox web companion for background typing in browser-based editors.
- Can play a completion chime and show a desktop notification when a run finishes.
- Provides a configurable countdown from 1 to 30 seconds.
- Displays status, character progress, and percentage.
- Pauses or resumes globally with
F8and cancels immediately withEsc. - Includes equivalent controls inside the application.
- Supports light, dark, and system themes.
- Switches the desktop app and browser extension between English and Spanish.
- Saves preferences locally without persisting the text.
- Enforces safety limits of 250,000 characters and eight hours per run.
Prebuilt installers are available on the GitHub Releases page:
- Windows 11, 64-bit: NSIS
.exeinstaller. - macOS, Apple Silicon:
.dmgimage.
Windows binaries are not code-signed, so SmartScreen may display a warning. The macOS release workflow always applies at least an ad-hoc signature so Gatekeeper does not misidentify the downloaded app as damaged. Without a Developer ID signature and notarization, macOS can still require the user to approve the first launch from Privacy & Security or by Control-clicking the app and selecting Open.
The screenshot directory is prepared at docs/screenshots. Final screenshots should be captured from signed macOS and Windows builds so they accurately show each platform's native window decoration.
- Node.js 26 or newer. The repository pins 26.8.1 in
.nvmrc. - npm 12 or newer. The repository declares npm 12.0.2 in
package.json. - Rust 1.98 or newer. The repository pins 1.98.0 in
rust-toolchain.toml. - The Tauri 2 prerequisites for your operating system.
Linux additionally requires the WebKitGTK development libraries listed by Tauri.
npm install
npm run tauri devThe first launch downloads and compiles the Rust dependencies, so it may take a few minutes.
npm run dev # Run the Vite frontend without the native typing engine
npm run typecheck # Check strict TypeScript types
npm run lint # Run ESLint
npm test # Run frontend unit tests
npm run check # Run typecheck, lint, and frontend tests
cargo test --manifest-path src-tauri/Cargo.tomlnpm run tauri buildInstallers are generated under src-tauri/target/release/bundle/. Configure macOS signing and notarization and Windows code signing before distributing production builds.
The release workflow uses an ad-hoc macOS signature when Apple credentials are unavailable. For normal Gatekeeper approval without a manual exception, add all of these GitHub Actions secrets:
APPLE_CERTIFICATE: base64-encoded Developer ID Application.p12certificate.APPLE_CERTIFICATE_PASSWORD: password used to export the certificate.APPLE_ID: Apple Developer account email.APPLE_PASSWORD: app-specific password for that Apple ID.APPLE_TEAM_ID: Apple Developer team identifier.
The workflow rejects a partial configuration, imports the Developer ID certificate, notarizes the app through Tauri, and verifies the DMG, bundle signature, Gatekeeper assessment, and stapled notarization ticket. If none of the five secrets exist, it verifies the ad-hoc signature instead.
In CI or a macOS session that cannot automate Finder, run CI=true npm run tauri build. Tauri will omit the DMG's visual Finder customization while still producing a valid installer.
- Paste or enter content in Your text.
- Select a speed preset or adjust the delay slider in milliseconds.
- Configure timing variation, the countdown, punctuation pauses, and optional typing mistakes.
- Optionally enable Protect target window to prevent typing into another window if focus changes.
- Select Start.
- Focus the target text field during the countdown. With target protection enabled, the foreground window at the end of the countdown becomes the target.
- Press
F8to pause or resume, orEscto cancel. After an automatic focus-loss pause, return to the target window before pressingF8.
Editing and settings are locked while a run is active so the displayed progress always matches the text being typed.
The text editor supports normal paragraphs, six heading levels, bold, italic, underline, and strikethrough. Select text to apply emphasis and use the paragraph style selector for headings. Subtitle uses Heading 2. Customize Heading 1–6 in Google Docs to apply your document's own fonts, sizes, and spacing.
Enable Apply formatting in Google Docs before starting a formatted run. The native engine sends Google's formatting shortcuts at each style change while continuing to type character by character. Keep Google Docs in the foreground for desktop typing. Leave the option disabled to type plain text into other apps. The generated console script also includes formatting when enabled; browser editors may ignore synthetic formatting shortcuts, so use desktop typing if this happens. The standalone browser extension uses its own plain-text field.
Choose Attach DOCX / TXT to replace the editor content with a local file.
Word .docx files preserve headings and supported emphasis; .txt files preserve
paragraphs. Old binary .doc files must first be saved as .docx in Word or Google
Docs. For a Google Doc, download it as Microsoft Word (.docx) before attaching.
Files are processed locally, with limits of 20 MB and 250,000 characters.
Tables and lists become text. Images, page layout, fonts, and other unsupported
styles are omitted; check the editor before starting transcription. Import errors
leave the previous editor content intact. Neither the document nor its formatting
is stored permanently.
- Open a blank workbook in Excel (or a compatible spreadsheet application) and select the starting cell, normally
A1. - In Human Typer, choose XLSX / CSV in the Spreadsheet section. The first worksheet in an XLSX file is used.
- Select Fill sheet, then return to the workbook during the countdown. Keep it in the foreground.
The spreadsheet mode writes each value as native keyboard input, uses Tab to advance through columns, and returns to the first column before moving to the next row. Blank cells are preserved. It reads files locally and limits imports to 100,000 cells and 250,000 characters. Embedded line breaks are converted to spaces because they would otherwise move Excel's selection to a different row.
| Action | Global shortcut | In-app alternative |
|---|---|---|
| Pause / resume | F8 |
Pause / Resume button |
| Cancel | Esc |
Cancel button |
Shortcuts are registered when the application starts. If another program has already reserved one, Human Typer displays a warning and keeps the in-app buttons available. The engine checks for cancellation every 25 ms, including during longer pauses. A run also stops on the first input error, after eight hours, or when the process closes.
Esc intentionally acts as a global shortcut while Human Typer is open. Close Human Typer when it is not in use if this conflicts with another utility.
macOS requires permission to generate keyboard events:
- Open System Settings.
- Go to Privacy & Security → Accessibility.
- Enable Human Typer.
- Quit and reopen the application if it was already running.
During development, the list may show Terminal, iTerm, your IDE, or the debug binary instead of Human Typer. Enable the process that runs npm run tauri dev. The application checks this permission before typing and displays instructions when it is missing.
If Human Typer appears enabled but the app still reports that permission is missing, quit it completely and reopen the same .app that you authorized. Unsigned development builds can receive a new code identity after recompilation; in that case, remove the old Human Typer entry with the − button, add the exact current .app with +, enable it, and reopen the app. Prefer copying the latest build to /Applications and always launching that copy.
| System | Status | Notes |
|---|---|---|
| macOS 12+ | Primary target | Requires Accessibility permission. Distributed binaries should be signed. |
| Windows 11 | Primary target | Elevated applications may reject events from a non-elevated process. |
| Linux X11 | Supported | Requires a graphical session and the Tauri system dependencies. |
| Linux Wayland | Experimental | Input injection and global shortcuts depend on compositor policy. |
Protected fields, elevated applications, games, and remote desktop software may reject simulated input.
src/
├── components/ # Small UI components and controls
├── hooks/ # Preferences, theme, and the Tauri bridge
├── lib/ # Pure logic and tests
├── types/ # TypeScript contracts
├── App.tsx
└── main.tsx
src-tauri/
├── src/
│ ├── lib.rs # Commands, shared state, and global shortcuts
│ ├── platform.rs # Platform-specific permission checks
│ └── typing_engine.rs # Countdown, timing, and Unicode input
├── capabilities/ # Minimal Tauri permissions
├── Cargo.toml
└── tauri.conf.json
React invokes Tauri commands and listens for state events. A native worker owns the countdown and typing loop, while enigo emits each character separately. Synchronized worker state lets global shortcuts pause or cancel without relying on WebView focus.
Only the speed, variation, countdown, theme, punctuation, typing-mistake, and target-window protection preferences are stored in localStorage. Text exists only in memory and is discarded when the application closes or reloads.
- Text is never sent over the network.
- There are no analytics, crash reporting services, or user accounts.
- Text is never written to logs.
- Tauri's content security policy restricts external resources.
Pure frontend logic tests cover Unicode counting, progress, persistence, duration estimates, document formatting ranges, sanitized imports, and an actual DOCX fixture. Rust tests cover delay components, the minimum delay, punctuation, and the main control-state transitions. Real keystrokes are validated manually on each platform because automating them would create fragile tests and could type into the wrong application.
npm run check
cargo test --manifest-path src-tauri/Cargo.tomlCopyright © 2026 AugustoOM.
Human Typer is free software licensed under the GNU General Public License version 3, identified by the SPDX expression GPL-3.0-only. You may use, study, modify, and redistribute it under the terms of that license. Distributed modified versions must preserve the same freedoms and provide the corresponding source as required by the GPL.