Instant floating notes. Plain Markdown. You own every file.
Features · Demo · Shortcuts · Get Started · Structure
Animated Ink floating panel mockup
Summon a frosted panel over any app, any Space, even fullscreen — start typing in milliseconds.
Global hotkey → floating panel appears instantly. No context switch. No Dock icon required. Dismiss with Esc or click outside.
Built on NSPanel with .nonactivatingPanel — stays above your work without stealing app activation.
All primary commands register through KeyboardShortcuts so users can remap keys.
Raw Markdown editing with a bottom toolbar that inserts syntax — not a WYSIWYG layer. What you see is what’s on disk.
Notes live as individual .md files (default: ~/Library/Application Support/Ink/Notes). Open them in Obsidian, VS Code, BBEdit, or git.
In-memory title + content index for fast browse/search — no database lock-in in v1.
The menu-bar icon keeps your last 25 copied text snippets (right/control-click → Clipboard History). Pick one to put it back on the clipboard. Copies that macOS or the source app marks as concealed, transient, autogenerated, or sensitive are skipped before Ink reads them.
| Action | Default | What it does |
|---|---|---|
| Create note | ⌥⌘N |
Opens the editor with a fresh note |
| Browse / toggle | ⌥⌘P |
Search and switch notes |
| Action panel | ⌥⌘K |
Command palette for all actions |
| Dismiss | Esc |
Hide the panel (Spotlight-style) |
git clone https://github.com/Cloverings1/Ink.git
cd Ink
open Ink/Ink.xcodeprojPress ⌘R in Xcode. You should get a menu bar extra, no main window, and ⌥⌘N summoning the panel.
To verify from Terminal:
xcodebuild test -project Ink/Ink.xcodeproj -scheme Ink -destination 'platform=macOS,arch=arm64'
- Ink has no backend. Notes are plain
.mdfiles on your Mac. - Clipboard history is stored locally at
~/Library/Application Support/Ink/clipboard-history.jsonand can be cleared from the menu-bar context menu. - Local deployment files, build products, app archives, dependency folders, and environment files are ignored by git.
- Ink is currently unsandboxed so user-selected note folders work without extra friction. Treat distributed builds as local developer builds unless they are signed and notarized through a release process.
Project generation checklist
The generated Xcode project is checked in for open-in-Xcode onboarding. Ink/project.yml remains the source used to regenerate it.
Regenerate after project-structure changes
cd Ink xcodegen generate --spec project.yml cd .. git diff -- Ink/project.yml Ink/Ink.xcodeproj
Target configuration
- General → Deployment Target: macOS 14.0 (Sonoma)+
- Info →
LSUIElement=YES(agent-style app, no Dock icon by default) - Info → URL Types → Item 0 → URL Schemes →
ink - Ensure
Ink/Resources/Assets.xcassetsis in Build Phases → Copy Bundle Resources - App Icon should point to
AppIconin asset catalog
Assets
- App icon is pre-built in
Ink/Resources/Assets.xcassets/AppIcon.appiconset/ - Master
.icnsatInk/Resources/Icons/Ink.icns
Build & run
- ⌘R — app launches without a main window or floating panel (expected)
- Press ⌥⌘N to verify the floating panel
- Run
xcodebuild test -project Ink/Ink.xcodeproj -scheme Ink -destination 'platform=macOS,arch=arm64'to verify persistence behavior
Ink/
├── InkApp.swift
├── App/
│ └── KeyboardShortcuts+Ink.swift
├── Core/
│ ├── Models/Note.swift
│ └── Services/NoteStore.swift
├── UI/
│ ├── Editor/InkEditorView.swift
│ ├── Browse/NotesBrowserView.swift
│ ├── FloatingPanel/
│ │ ├── FloatingNotePanel.swift
│ │ ├── FloatingPanelController.swift
│ │ └── FloatingPanelRootView.swift
│ └── CommandPalette/ActionPanelView.swift
├── Tests/
│ └── NoteStoreTests.swift
├── Resources/
│ ├── Assets.xcassets/
│ └── Icons/Ink.icns
├── Info.plist
└── Ink.entitlements
| Principle | Implementation |
|---|---|
| Instant | Global hotkey + non-activating NSPanel |
| Native | SwiftUI + AppKit, frosted HUD window material |
| Portable | Plain .md files on disk, debounced per-note auto-save with flush-on-transition |
| Lightweight | One dependency (KeyboardShortcuts) for hotkeys |
| Searchable | In-memory index, no SQLite in v1 |