Textus
You hold the pen. AI keeps your ink flowing. Textus is a free, open-source, next-generation Markdown editor for macOS, Windows and Linux, with a writing assistant built in.
Music, timers, downloads, dictation and AI in a small black island at the top of your screen.
ProductivityRust · JavaScriptGitHub @eigenesOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
A MacBook-style dynamic notch for Windows: music, timers, downloads, dictation and AI in a small island at the top of your screen. Rust, zero idle CPU.
Loading the full README. The saved excerpt is shown below.
The notch Windows never had.
A small black island at the top of your screen for music, timers, downloads, dictation and AI.
It grows when something happens and gets out of the way when nothing does.
Live activities
Peeks
Claude Code hook
Screenshots are taken from the interactive demo on the website , which mirrors the app's layout and animations.
The notch has four sizes and moves between them with spring physics.Read the full README ↗The notch Windows never had.
A small black island at the top of your screen for music, timers, downloads, dictation and AI. It grows when something happens and gets out of the way when nothing does.
Download · Website and live demo · Changelog · Report a bug
Screenshots are taken from the interactive demo on the website, which mirrors the app's layout and animations.
The notch has four sizes and moves between them with spring physics.
Each module is a single Rust file that sleeps until Windows tells it something changed. Turn any of them off from the tray menu or in the config.
| Module | What it does | Built on |
|---|---|---|
| Media | Artwork, title and controls for whatever is playing. The visualizer takes its color from the album art. | System Media Transport Controls |
| Timer | Timers and a stopwatch, with a countdown ring in the notch and a chime when done. | Ticks only while running |
| Downloads | Browser downloads with size and speed, and a peek when they finish. Open the file or its folder. | ReadDirectoryChangesW |
| Clipboard | Your recent copies: text, links, files and images. Click one to copy it again. | Memory only, skips password managers |
| Shelf | Drop files on the notch to park them, then drag them out into any folder or app later. | OLE drag and drop |
| Dictation | Hold Ctrl+Alt+D and speak. The text is typed into the app you were using. | WASAPI capture, Whisper on Groq |
| Ask AI | A quick prompt with streamed answers and follow-ups. | OpenRouter, any model |
| Mic & Camera | A dot whenever an app uses your microphone or camera, and a peek naming it. | Capability consent store |
| Dev Servers | Local dev servers on localhost as they start, each with an Open button. | TCP listener table |
| Lock Keys | A short peek when Caps Lock, Num Lock or Scroll Lock changes. | Raw keyboard input |
| Battery | Level and charging state in the header, with peeks for plugged in, unplugged, low and full. | WM_POWERBROADCAST |
| Volume & Brightness | Replaces the Windows volume flyout with a notch peek; brightness changes on the built-in display peek too. | IAudioEndpointVolume, WMI |
| Bluetooth | Connect and disconnect peeks with the device's battery level, plus a low-battery warning. | DeviceWatcher, GATT Battery Service |
| System Stats | CPU, RAM and GPU load on the home page, sampled only while the notch is open. |
windows-x64 for most Intel and AMD PCswindows-arm64 for Snapdragon and other Windows on ARM PCsdynamic-notch.exe. There is no installer and no runtime to install.The exe isn't code-signed yet, so SmartScreen may warn the first time you run it. Choose More info → Run anyway.
Requirements: Windows 10 version 1903 or later. Windows 11 is recommended for the frosted glass.
To update, quit the notch from the tray and replace the exe. Your settings live in %APPDATA%\DynamicNotch and are kept.
| Shortcut | Action |
|---|---|
| Ctrl+Alt+N | Open or close the notch |
| Ctrl+Alt+Space | Ask AI |
| Ctrl+Alt+D | Dictate: tap to start and stop, or hold to talk |
| Ctrl+Alt+T | Timer |
| Ctrl+Alt+V | Clipboard history |
| Volume keys | Volume peek instead of the Windows flyout |
Every shortcut can be changed or turned off in the [hotkeys] section of the config. Play/pause has no default shortcut.
Settings live in %APPDATA%\DynamicNotch\config.toml, which is created with comments on first start. Changes apply as soon as you save the file. Open it from the tray with Edit settings….
[general]
monitor = "primary" # "primary", "active" (follow the focused window) or 1, 2, ...
expand_on_hover = true
idle_style = "notch" # "notch", "pill" (slim line when idle) or "hidden"
hide_in_fullscreen = true
[appearance]
blur = true
bounce = 0.3 # 0 = no overshoot ... 1 = very bouncy
accent = "auto" # from the album art, or "#RRGGBB"
scale = 1.0
[hotkeys]
toggle = "Ctrl+Alt+N"
ai = "Ctrl+Alt+Space"
dictate = "Ctrl+Alt+D"
[modules]
bluetooth = true # every module can be switched off here
[ai]
model = "google/gemini-3.1-flash-lite" # any OpenRouter model id
Every key is optional. A missing or invalid value falls back to its default, and the full default config documents each option.
Ask AI and dictation are optional; everything else works without a key. They read their keys from the environment or from a .env file, never from config.toml:
# Ask AI: https://openrouter.ai/keys
OPENROUTER_API_KEY=sk-or-...
# Dictation: https://console.groq.com/keys
GROQ_API_KEY=gsk_...
Copy .env.example from the zip to .env and fill in your keys. The notch looks for .env in this order:
dynamic-notch.exe, then up to three parent folders%APPDATA%\DynamicNotch\.envRun the exe again while the notch is running and it hands the command to the running notch. Put it at the end of a build, a render or a backup.
dynamic-notch notify "Build finished" "All 112 tests passed"
dynamic-notch progress "Rendering" 42 # 0-100, then "done" or "cancel"
dynamic-notch timer 25 # start a 25 minute timer, 0 resets
dynamic-notch ask "convert 72F to C" # ask the AI
dynamic-notch expand timer # open the notch on a tab
dynamic-notch toggle | expand | collapse | ai | reload | quit
Run dynamic-notch --help for the full list.
Add dynamic-notch claude as a Stop and Notification hook in your Claude Code settings (~/.claude/settings.json). The exe needs to be on your PATH, or use its full path.
{
"hooks": {
"Stop": [{ "hooks": [{ "type": "command", "command": "dynamic-notch claude" }] }],
"Notification": [{ "hooks": [{ "type": "command", "command": "dynamic-notch claude" }] }]
}
}
It stays quiet while you're looking at the terminal Claude runs in, and peeks when you're not. Clicking the peek brings that terminal to the front. Add --always to peek even when the terminal is focused. The hook never starts the notch, so it returns immediately when the notch isn't running.
Dynamic Notch is written in Rust directly on the Windows compositor. Nothing is drawn unless something changes, and the music visualizer is animated by the compositor itself, so playback costs no CPU either.
| Idle CPU | 0 ms per 10 s |
| Memory | about 25 MB private, idle |
| Download | about 1.5 MB, no runtime needed |
| Startup | 0.35 s to first frame |
Measured on an ARM64 laptop at 4K and 150% scaling, release build.
You need Rust (stable) and the MSVC build tools (Visual Studio Build Tools with "Desktop development with C++").
git clone https://github.com/eigenes/DynamicNotch.git
cd DynamicNotch
cargo build --release
.\target\release\dynamic-notch.exe
Debug builds keep a console window open for log output. To build for the other architecture, add its target first:
rustup target add aarch64-pc-windows-msvc # or x86_64-pc-windows-msvc
cargo build --release --target aarch64-pc-windows-msvc
Before opening a pull request, run the same checks as CI:
cargo fmt --check
cargo clippy --all-targets -- -D warnings
cargo test
src/
main.rs entry point, single instance, command-line forwarding
app.rs notch state machine: modes, peeks, pages, hit testing
host.rs Windows.UI.Composition visual tree and backdrop blur
window.rs Win32 window plumbing and message loop
anim.rs spring animations
pacer.rs frame pacing: draw only while something moves
gfx/ Direct2D / DirectWrite drawing, icons, images
modules/ one file per module
sys/ Windows helpers: audio, clipboard, drag and drop, HTTP, speech to text
config.rs config.toml, defaults and hot reload
claude.rs Claude Code hook bridge
site/ the website, deployed to GitHub Pages
A module implements the Module trait in src/modules/mod.rs and is added to modules::all(). It runs on the UI thread, gets messages from its own worker threads through the Bus, and can contribute any of:
Give it a switch in [modules] in src/config.rs so it can be turned off.
Add a section for the new version to CHANGELOG.md, bump version in Cargo.toml, then tag and push:
git tag v0.2.0
git push origin v0.2.0
The release workflow builds x64 and ARM64 zips, writes checksums and publishes the release with the changelog section as notes.
idle_style = "hidden" it only shows on activity. Check the tray menu: Hide notch may be on..env file in one of the places listed above and try again. The file is read on every request, so no restart is needed.%APPDATA%\DynamicNotch\notch.log. Please attach the relevant lines when you open an issue, and check them for anything private first.GetSystemTimes, PDH GPU counters |
| Claude Code | Tells you when Claude finishes or needs you. Click the peek to bring its terminal back. | Stop and Notification hooks |