Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ Each version's section is shown in the in-app update window and on the GitHub re

## Unreleased

### New
- **Share passwords safely.** A protected note now has a share button: pick which fields go and Menew makes an encrypted `.menewsecret` file to drag into Teams, Slack or an email, instead of pasting the password in the chat. Send it to a contact (add their Menew code once, from Notes › Share passwords) and only their Mac can open it, with the sender verified; or protect it with a password Menew generates and pass that on another way. To receive, drop the file on the notch, double-click it or use Import file; it becomes a protected note. Everything is encrypted on your Mac.

### Fixed
- **Codex and the ChatGPT app in the notch.** Codex only runs hooks you approved, and the ChatGPT app (which runs Codex inside) skips unapproved ones without asking, so its sessions never reached the notch. Turning on Codex in AI agents › Set up now also records the approval for Menew's own commands in `~/.codex/config.toml`. If Codex shows as Outdated, press Update once.

Expand Down
18 changes: 16 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,10 +111,23 @@ Give one an abbreviation like `;sig` and typing it in any app turns it into the
</details>

<details>
<summary>📝 <b>Notes</b> — Many notes with #tags, search and Markdown (checklists included).</summary>
<summary>📝 <b>Notes</b> — Many notes with #tags, search and Markdown (checklists included), and passwords you can share safely.</summary>

Protected notes live in the Keychain and open with Touch ID. With Apple Intelligence, a note's ⋯ menu can **summarize it** or **extract its to-dos** as a checklist, on your Mac. **Password notes** keep name and value rows with hidden values, an eye to reveal and a copy button; copied values are marked confidential (no clipboard history) and cleared after 30 seconds. Switch a note's type at any time.

**Share passwords without pasting them in a chat.** Press the share button on a protected note, pick which fields go, and Menew makes an encrypted `.menewsecret` file to drag into Teams, Slack or an email. Send it **to a contact** (they send you their Menew code once; it's public, so chat is fine) and only their Mac can open it, with the sender verified; or **with a password** Menew generates, which you pass on another way (a call, a text, in person). The other person drops the file on the notch, double-clicks it or imports it in Notes › Share passwords, and it becomes a protected note on their Mac. Encryption happens on your Mac (X25519 and AES-GCM, or PBKDF2 with 600,000 rounds for the password); nothing goes over the internet.

<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/share-secret-dark.png">
<img src="docs/assets/share-secret-light.png" width="300" alt="Sharing a password note with a contact">
</picture>
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/share-import-dark.png">
<img src="docs/assets/share-import-light.png" width="300" alt="Importing a received secret">
</picture>
</p>

</details>

<details>
Expand Down Expand Up @@ -414,7 +427,7 @@ Menew only reads what it shows. With the menu closed it uses about **0.5% CPU, 1

## Privacy

The app has **no telemetry, no analytics and no account**. Clipboard history and notes are stored locally in `~/Library/Application Support/Menew`. Items marked as passwords by password managers (`org.nspasteboard.ConcealedType`) are never saved. Values copied from password notes are marked the same way and cleared from the clipboard after 30 seconds. Backups are files you save yourself; protected notes are never included in them. The only network calls are the ones you can see: your public IP (`api.ipify.org`), the speed test you start yourself, a currency rate when you press ↩ on a conversion in the command palette (`api.frankfurter.app`, European Central Bank data), and a daily update check against this repo's releases (you can turn it off). Text recognition (copy text from screen or images) uses Apple's Vision framework on your Mac; nothing is uploaded, and the screen capture is deleted right after. AI text actions use only Apple's on-device model (never Private Cloud Compute), so the text stays on your Mac. The next meeting is read from the Calendar app through EventKit, only if you turn it on, and stays on your Mac. Notes you can search in Spotlight are indexed by macOS on your Mac (never protected or password notes, never the clipboard history). Live captions listen only while they are on and never record; speech is recognized and translated on your Mac. Recordings only happen when you start them; the audio, transcript and minutes are kept in `~/Library/Application Support/Menew/recordings`. Memory captures are only taken when you press the shortcut and are kept in `~/Library/Application Support/Menew/memory`; Automatic Memory is off until you turn on a source, reads screenshots, recordings, notes and agent logs on your Mac only (no network) and strips keys and tokens before saving. Widgets read a small file Menew rewrites every minute in its own shared container (`~/Library/Group Containers/9527N6XKKW.com.matheusquost.menew`); they run sandboxed and have no network access. AI agents: usage is read from the logs Claude Code, Codex and Gemini CLI already keep on your Mac (`~/.claude`, `~/.codex`, `~/.gemini`), and the daily totals for the long-term charts stay in `~/Library/Application Support/Menew/agent-usage.json` (no prompts or transcripts); agent hooks and the MCP server talk to Menew through local macOS notifications (if you turn on access for agents in Docker, Menew also listens on `127.0.0.1:47833`, never on your network, and only answers requests carrying a random key you can change), and loaded Ollama and LM Studio models are read from their local ports (`127.0.0.1`). The one optional network call here is **Claude limits**, off by default: when you turn it on, Menew reads the login Claude Code keeps in your Keychain (through the same `security` tool Claude Code uses to save it, so macOS doesn't ask for your password every time it renews) and checks `api.anthropic.com` every 5 minutes for the 5-hour and weekly usage; nothing else is sent.
The app has **no telemetry, no analytics and no account**. Clipboard history and notes are stored locally in `~/Library/Application Support/Menew`. Items marked as passwords by password managers (`org.nspasteboard.ConcealedType`) are never saved. Values copied from password notes are marked the same way and cleared from the clipboard after 30 seconds. Backups are files you save yourself; protected notes are never included in them. Shared passwords are encrypted on your Mac into a file you send yourself; your sharing key stays in the Keychain, and your contacts' public codes in `~/Library/Application Support/Menew/share-contacts.json`. The only network calls are the ones you can see: your public IP (`api.ipify.org`), the speed test you start yourself, a currency rate when you press ↩ on a conversion in the command palette (`api.frankfurter.app`, European Central Bank data), and a daily update check against this repo's releases (you can turn it off). Text recognition (copy text from screen or images) uses Apple's Vision framework on your Mac; nothing is uploaded, and the screen capture is deleted right after. AI text actions use only Apple's on-device model (never Private Cloud Compute), so the text stays on your Mac. The next meeting is read from the Calendar app through EventKit, only if you turn it on, and stays on your Mac. Notes you can search in Spotlight are indexed by macOS on your Mac (never protected or password notes, never the clipboard history). Live captions listen only while they are on and never record; speech is recognized and translated on your Mac. Recordings only happen when you start them; the audio, transcript and minutes are kept in `~/Library/Application Support/Menew/recordings`. Memory captures are only taken when you press the shortcut and are kept in `~/Library/Application Support/Menew/memory`; Automatic Memory is off until you turn on a source, reads screenshots, recordings, notes and agent logs on your Mac only (no network) and strips keys and tokens before saving. Widgets read a small file Menew rewrites every minute in its own shared container (`~/Library/Group Containers/9527N6XKKW.com.matheusquost.menew`); they run sandboxed and have no network access. AI agents: usage is read from the logs Claude Code, Codex and Gemini CLI already keep on your Mac (`~/.claude`, `~/.codex`, `~/.gemini`), and the daily totals for the long-term charts stay in `~/Library/Application Support/Menew/agent-usage.json` (no prompts or transcripts); agent hooks and the MCP server talk to Menew through local macOS notifications (if you turn on access for agents in Docker, Menew also listens on `127.0.0.1:47833`, never on your network, and only answers requests carrying a random key you can change), and loaded Ollama and LM Studio models are read from their local ports (`127.0.0.1`). The one optional network call here is **Claude limits**, off by default: when you turn it on, Menew reads the login Claude Code keeps in your Keychain (through the same `security` tool Claude Code uses to save it, so macOS doesn't ask for your password every time it renews) and checks `api.anthropic.com` every 5 minutes for the 5-hour and weekly usage; nothing else is sent.

The website ([menew.web.app](https://menew.web.app/?ref=github)) counts visits and button clicks with [GoatCounter](https://www.goatcounter.com), which uses no cookies and stores no personal data. The app itself never does this.

Expand Down Expand Up @@ -545,6 +558,7 @@ Recently shipped:
- [x] Battery care: charge-level and heat alerts, health history
- [x] Menew window with a sidebar, and Memory (capture with source, OCR and AI tags)
- [x] Ask your memory in plain words, with sources, and memory in Spotlight
- [x] Share passwords as encrypted files, to a contact or with a password

</details>

Expand Down
21 changes: 21 additions & 0 deletions Resources/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,27 @@
<key>CFBundleURLSchemes</key><array><string>menew</string></array>
</dict>
</array>
<!-- .menewsecret: senha compartilhada, criptografada; dois cliques abrem a tela de importar -->
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key><string>com.matheusquost.menew.secret</string>
<key>UTTypeDescription</key><string>Menew Shared Secret</string>
<key>UTTypeConformsTo</key><array><string>public.data</string></array>
<key>UTTypeIconSystemGenerated</key><true/>
<key>UTTypeTagSpecification</key>
<dict><key>public.filename-extension</key><array><string>menewsecret</string></array></dict>
</dict>
</array>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key><string>Menew Shared Secret</string>
<key>CFBundleTypeRole</key><string>Viewer</string>
<key>LSHandlerRank</key><string>Owner</string>
<key>LSItemContentTypes</key><array><string>com.matheusquost.menew.secret</string></array>
</dict>
</array>
<key>NSHighResolutionCapable</key><true/>
<key>CFBundleDevelopmentRegion</key><string>en</string>
<key>CFBundleLocalizations</key>
Expand Down
14 changes: 13 additions & 1 deletion Sources/Menew/App.swift
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSPopoverDelegate {
}
}

func popoverShouldClose(_ popover: NSPopover) -> Bool { !notes.authenticating }
func popoverShouldClose(_ popover: NSPopover) -> Bool { !notes.authenticating && !ShareKeys.shared.picking }

/// Fechar o menu tranca de novo as notas protegidas
func popoverDidClose(_ notification: Notification) {
Expand Down Expand Up @@ -377,6 +377,13 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSPopoverDelegate {
showPopover()
}

/// Abre a tela de importar um segredo compartilhado na aba Notas
func importSecret(_ url: URL) {
ShareKeys.shared.pendingImport = url
nav.tab = .notes
showPopover()
}

/// Resultado do Spotlight: abre a nota escolhida
func application(_ application: NSApplication, continue userActivity: NSUserActivity,
restorationHandler: @escaping ([any NSUserActivityRestoring]) -> Void) -> Bool {
Expand All @@ -393,6 +400,11 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSPopoverDelegate {

/// Toque num widget (menew://system, menew://meetings…): abre o Menew na aba Sistema
func application(_ application: NSApplication, open urls: [URL]) {
// Segredo compartilhado (.menewsecret): dois cliques no Finder ou "Abrir com"
if let file = urls.first(where: { $0.isFileURL && $0.pathExtension.lowercased() == SecretShare.fileExtension }) {
importSecret(file)
return
}
guard urls.contains(where: { $0.scheme == "menew" }) else { return }
nav.tab = .system
showPopover()
Expand Down
Loading
Loading