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
13 changes: 13 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,3 +164,16 @@ Downloads per version, update checks and repo traffic, all from GitHub's public
## Reporting bugs

Use **Report a problem…** in Menew's right-click menu: it opens a GitHub issue with your versions filled in. Or open an [issue](https://github.com/Quost/menew/issues/new/choose) directly.

## Promo video

The promo video is rendered off-screen from demo data, so it never shows your real screen and needs no screen recording permission:

```bash
./build.sh
build/Menew.app/Contents/MacOS/Menew --video-frames /tmp/frames -language en
swift scripts/make-video.swift /tmp/frames /tmp/video-out
ffmpeg -framerate 30 -i /tmp/video-out/%04d.jpg -c:v libx264 -crf 26 -pix_fmt yuv420p -movflags +faststart menew.mp4
```

The video has no burned-in text besides shortcuts and the address, so one file serves every language.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
</picture>
</p>

<p align="center"><a href="https://menew.web.app/?ref=github#demo"><b>▶ Watch the 30-second demo</b></a></p>

## Highlights

### 🧠 Memory — <kbd>⌃</kbd><kbd>⌥</kbd><kbd>⌘</kbd><kbd>K</kbd>
Expand Down
2 changes: 2 additions & 0 deletions Sources/Menew/App.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ enum MenewMain {
if !DemoMode.isOn { Migration.run() }
if let i = CommandLine.arguments.firstIndex(of: "--snapshot"), CommandLine.arguments.count > i + 1 {
Snapshot.run(into: URL(fileURLWithPath: CommandLine.arguments[i + 1]))
} else if let i = CommandLine.arguments.firstIndex(of: VideoFrames.flag), CommandLine.arguments.count > i + 1 {
VideoFrames.run(into: URL(fileURLWithPath: CommandLine.arguments[i + 1]))
} else if let i = CommandLine.arguments.firstIndex(of: "--preview"), CommandLine.arguments.count > i + 1 {
Snapshot.preview(tab: CommandLine.arguments[i + 1])
} else if CommandLine.arguments.contains("--hardware") {
Expand Down
80 changes: 80 additions & 0 deletions Sources/Menew/VideoFrames.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import AppKit
import SwiftUI

/// `Menew --demo --video-frames <pasta>`: renderiza, com os dados fictícios, os quadros-chave do vídeo de
/// divulgação (abas do menu, busca no clipboard, palette sendo digitada, CPU e notch) e sai.
/// `scripts/make-video.swift` monta esses quadros no vídeo. Nada vem da tela real, então não precisa de
/// permissão de gravação e funciona em qualquer idioma (`-language`).
@MainActor
enum VideoFrames {
static let flag = "--video-frames"

static func run(into dir: URL) {
try? FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true)
Theme.flatGlass = true
let monitor = SystemMonitor()
let clipboard = ClipboardManager.demo()
MeetingStore.shared.showDemo()
NetUsage.shared.showDemo()
SystemHistory.shared.showDemo()
Sensors.shared.showDemo()
let toolbox = Toolbox()
toolbox.keepAwake = true
DemoMode.fakeDisplays(toolbox)
let internet = InternetInfo()
DemoMode.fakeInternet(internet)
let notes = NotesStore.demo()
WorldClock.shared.demo()
ProfileStore.shared.demo()
AutomationStore.shared.demo()
monitor.start()

DispatchQueue.main.asyncAfter(deadline: .now() + 6.5) {
DemoMode.fakeMachine(monitor)
func out(_ name: String) -> URL { dir.appendingPathComponent(name + ".png") }
@MainActor func popover(_ tab: Tab, query: String = "") -> some View {
let nav = PopoverState()
nav.tab = tab
let cs = ClipListState()
cs.query = query
return MainView(nav: nav, monitor: monitor, clipboard: clipboard, toolbox: toolbox, internet: internet,
notes: notes, cleaner: Cleaner(), updater: UpdaterModel(enabled: false), clipState: cs, onPickClip: { _, _ in })
}
let pop = NSSize(width: 400, height: 600)
for tab in [Tab.now, .clipboard, .actions, .system] {
Snapshot.render(popover(tab), size: pop, dark: true, to: out("popover-\(tab)"))
}
// Busca no clipboard, letra a letra
let search = "github"
for n in 1...search.count {
Snapshot.render(popover(.clipboard, query: String(search.prefix(n))), size: pop, dark: true,
to: out("clip-search-\(n)"))
}
// Palette: duas consultas digitadas letra a letra
let palette = PaletteModel(toolbox: toolbox, clipboard: clipboard, notes: notes)
palette.isDemo = true
palette.update()
Snapshot.render(PaletteController.chrome(PaletteView(model: palette)), size: PaletteController.size, dark: true,
background: .clear, to: out("palette-0-0"))
for (q, text) in ["5 km to mi", "timer 10m tea"].enumerated() {
for n in 1...text.count {
palette.query = String(text.prefix(n))
Snapshot.render(PaletteController.chrome(PaletteView(model: palette)), size: PaletteController.size, dark: true,
background: .clear, to: out("palette-\(q + 1)-\(n)"))
}
}
// Notch ao passar o mouse: próxima reunião e atalhos
let hm = NotchHoverModel()
hm.shown = true
hm.meeting = Meeting(id: "demo", title: L("Alinhamento semanal"), start: Date().addingTimeInterval(14 * 60),
end: Date().addingTimeInterval(44 * 60), link: URL(string: "https://meet.example.com/abc"), color: .orange)
hm.focusEnd = Date().addingTimeInterval(18 * 60)
hm.after = Meeting(id: "d3", title: L("Revisão do trimestre"), start: Date().addingTimeInterval(3 * 3600),
end: Date().addingTimeInterval(4 * 3600), link: nil, color: .purple)
Snapshot.render(NotchHoverView(model: hm, notch: CGSize(width: 200, height: 37)).frame(width: 480, height: 172),
size: NSSize(width: 480, height: 172), dark: true, background: .clear, to: out("notch"))
print("Video frames saved to \(dir.path)")
exit(0)
}
}
}
Binary file added docs/assets/menew-demo-poster.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/menew-demo.mp4
Binary file not shown.
Binary file added docs/assets/menew-demo.webm
Binary file not shown.
16 changes: 15 additions & 1 deletion docs/de/index.html

Large diffs are not rendered by default.

16 changes: 15 additions & 1 deletion docs/es/index.html

Large diffs are not rendered by default.

16 changes: 15 additions & 1 deletion docs/index.html

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion docs/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> Free, open source Mac menu bar app: command palette, clipboard history, windows, screenshots, meeting notes, screen memory and on-device AI. No account.

Menew 1.103.0 (updated 2026-11-11). Native Swift/SwiftUI app for macOS 14 or later, Apple Silicon and Intel. Free and open source (GPL-3.0). Signed with an Apple Developer ID and notarized. Made by Quost.
Menew 1.103.0 (updated 2026-11-12). Native Swift/SwiftUI app for macOS 14 or later, Apple Silicon and Intel. Free and open source (GPL-3.0). Signed with an Apple Developer ID and notarized. Made by Quost.

## Highlights

Expand Down
16 changes: 15 additions & 1 deletion docs/pt/index.html

Large diffs are not rendered by default.

24 changes: 12 additions & 12 deletions docs/sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://menew.web.app/</loc>
<lastmod>2026-11-11</lastmod>
<lastmod>2026-11-12</lastmod>
<xhtml:link rel="alternate" hreflang="en" href="https://menew.web.app/"/>
<xhtml:link rel="alternate" hreflang="pt-BR" href="https://menew.web.app/pt"/>
<xhtml:link rel="alternate" hreflang="de" href="https://menew.web.app/de"/>
Expand All @@ -11,7 +11,7 @@
</url>
<url>
<loc>https://menew.web.app/pt</loc>
<lastmod>2026-11-11</lastmod>
<lastmod>2026-11-12</lastmod>
<xhtml:link rel="alternate" hreflang="en" href="https://menew.web.app/"/>
<xhtml:link rel="alternate" hreflang="pt-BR" href="https://menew.web.app/pt"/>
<xhtml:link rel="alternate" hreflang="de" href="https://menew.web.app/de"/>
Expand All @@ -20,7 +20,7 @@
</url>
<url>
<loc>https://menew.web.app/de</loc>
<lastmod>2026-11-11</lastmod>
<lastmod>2026-11-12</lastmod>
<xhtml:link rel="alternate" hreflang="en" href="https://menew.web.app/"/>
<xhtml:link rel="alternate" hreflang="pt-BR" href="https://menew.web.app/pt"/>
<xhtml:link rel="alternate" hreflang="de" href="https://menew.web.app/de"/>
Expand All @@ -29,7 +29,7 @@
</url>
<url>
<loc>https://menew.web.app/es</loc>
<lastmod>2026-11-11</lastmod>
<lastmod>2026-11-12</lastmod>
<xhtml:link rel="alternate" hreflang="en" href="https://menew.web.app/"/>
<xhtml:link rel="alternate" hreflang="pt-BR" href="https://menew.web.app/pt"/>
<xhtml:link rel="alternate" hreflang="de" href="https://menew.web.app/de"/>
Expand All @@ -38,7 +38,7 @@
</url>
<url>
<loc>https://menew.web.app/zh</loc>
<lastmod>2026-11-11</lastmod>
<lastmod>2026-11-12</lastmod>
<xhtml:link rel="alternate" hreflang="en" href="https://menew.web.app/"/>
<xhtml:link rel="alternate" hreflang="pt-BR" href="https://menew.web.app/pt"/>
<xhtml:link rel="alternate" hreflang="de" href="https://menew.web.app/de"/>
Expand All @@ -47,30 +47,30 @@
</url>
<url>
<loc>https://menew.web.app/vs</loc>
<lastmod>2026-11-11</lastmod>
<lastmod>2026-11-12</lastmod>
</url>
<url>
<loc>https://menew.web.app/vs/raycast</loc>
<lastmod>2026-11-11</lastmod>
<lastmod>2026-11-12</lastmod>
</url>
<url>
<loc>https://menew.web.app/vs/maccy</loc>
<lastmod>2026-11-11</lastmod>
<lastmod>2026-11-12</lastmod>
</url>
<url>
<loc>https://menew.web.app/vs/rectangle</loc>
<lastmod>2026-11-11</lastmod>
<lastmod>2026-11-12</lastmod>
</url>
<url>
<loc>https://menew.web.app/vs/istat-menus</loc>
<lastmod>2026-11-11</lastmod>
<lastmod>2026-11-12</lastmod>
</url>
<url>
<loc>https://menew.web.app/vs/cleanshot</loc>
<lastmod>2026-11-11</lastmod>
<lastmod>2026-11-12</lastmod>
</url>
<url>
<loc>https://menew.web.app/vs/otter</loc>
<lastmod>2026-11-11</lastmod>
<lastmod>2026-11-12</lastmod>
</url>
</urlset>
2 changes: 1 addition & 1 deletion docs/vs/cleanshot/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<link rel="canonical" href="https://menew.web.app/vs/cleanshot">
<link rel="icon" type="image/png" href="/assets/icon.png">
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
<script type="application/ld+json">{"@context": "https://schema.org", "@graph": [{"@type": "WebPage", "name": "Menew vs CleanShot X: free screenshots with annotations for Mac", "url": "https://menew.web.app/vs/cleanshot", "description": "How Menew's screenshots compare with CleanShot X: annotations, blur, pinning, screen recording with sound, GIF, scrolling capture and copying text from the screen.", "inLanguage": "en", "about": {"@type": "SoftwareApplication", "name": "Menew", "alternateName": "Menew for Mac", "operatingSystem": "macOS", "url": "https://menew.web.app/", "offers": {"@type": "Offer", "price": "0", "priceCurrency": "USD"}}, "dateModified": "2026-11-11"}, {"@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Menew", "item": "https://menew.web.app/"}, {"@type": "ListItem", "position": 2, "name": "Comparisons", "item": "https://menew.web.app/vs"}, {"@type": "ListItem", "position": 3, "name": "Menew vs CleanShot X", "item": "https://menew.web.app/vs/cleanshot"}]}]}</script>
<script type="application/ld+json">{"@context": "https://schema.org", "@graph": [{"@type": "WebPage", "name": "Menew vs CleanShot X: free screenshots with annotations for Mac", "url": "https://menew.web.app/vs/cleanshot", "description": "How Menew's screenshots compare with CleanShot X: annotations, blur, pinning, screen recording with sound, GIF, scrolling capture and copying text from the screen.", "inLanguage": "en", "about": {"@type": "SoftwareApplication", "name": "Menew", "alternateName": "Menew for Mac", "operatingSystem": "macOS", "url": "https://menew.web.app/", "offers": {"@type": "Offer", "price": "0", "priceCurrency": "USD"}}, "dateModified": "2026-11-12"}, {"@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Menew", "item": "https://menew.web.app/"}, {"@type": "ListItem", "position": 2, "name": "Comparisons", "item": "https://menew.web.app/vs"}, {"@type": "ListItem", "position": 3, "name": "Menew vs CleanShot X", "item": "https://menew.web.app/vs/cleanshot"}]}]}</script>
<script data-goatcounter="https://menew.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
<style>
:root {
Expand Down
2 changes: 1 addition & 1 deletion docs/vs/istat-menus/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<link rel="canonical" href="https://menew.web.app/vs/istat-menus">
<link rel="icon" type="image/png" href="/assets/icon.png">
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
<script type="application/ld+json">{"@context": "https://schema.org", "@graph": [{"@type": "WebPage", "name": "Menew vs iStat Menus and Stats: a free system monitor for the Mac menu bar", "url": "https://menew.web.app/vs/istat-menus", "description": "How Menew's system monitor compares with iStat Menus and Stats: CPU, GPU, memory, disk, network, battery, temperatures, history and alerts.", "inLanguage": "en", "about": {"@type": "SoftwareApplication", "name": "Menew", "alternateName": "Menew for Mac", "operatingSystem": "macOS", "url": "https://menew.web.app/", "offers": {"@type": "Offer", "price": "0", "priceCurrency": "USD"}}, "dateModified": "2026-11-11"}, {"@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Menew", "item": "https://menew.web.app/"}, {"@type": "ListItem", "position": 2, "name": "Comparisons", "item": "https://menew.web.app/vs"}, {"@type": "ListItem", "position": 3, "name": "Menew vs iStat Menus and Stats", "item": "https://menew.web.app/vs/istat-menus"}]}]}</script>
<script type="application/ld+json">{"@context": "https://schema.org", "@graph": [{"@type": "WebPage", "name": "Menew vs iStat Menus and Stats: a free system monitor for the Mac menu bar", "url": "https://menew.web.app/vs/istat-menus", "description": "How Menew's system monitor compares with iStat Menus and Stats: CPU, GPU, memory, disk, network, battery, temperatures, history and alerts.", "inLanguage": "en", "about": {"@type": "SoftwareApplication", "name": "Menew", "alternateName": "Menew for Mac", "operatingSystem": "macOS", "url": "https://menew.web.app/", "offers": {"@type": "Offer", "price": "0", "priceCurrency": "USD"}}, "dateModified": "2026-11-12"}, {"@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Menew", "item": "https://menew.web.app/"}, {"@type": "ListItem", "position": 2, "name": "Comparisons", "item": "https://menew.web.app/vs"}, {"@type": "ListItem", "position": 3, "name": "Menew vs iStat Menus and Stats", "item": "https://menew.web.app/vs/istat-menus"}]}]}</script>
<script data-goatcounter="https://menew.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
<style>
:root {
Expand Down
2 changes: 1 addition & 1 deletion docs/vs/maccy/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<link rel="canonical" href="https://menew.web.app/vs/maccy">
<link rel="icon" type="image/png" href="/assets/icon.png">
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
<script type="application/ld+json">{"@context": "https://schema.org", "@graph": [{"@type": "WebPage", "name": "Menew vs Maccy and Paste: a free clipboard manager for Mac, and more", "url": "https://menew.web.app/vs/maccy", "description": "How Menew's clipboard history compares with Maccy and Paste: search, pins, snippets, paste queue and privacy. Free and open source.", "inLanguage": "en", "about": {"@type": "SoftwareApplication", "name": "Menew", "alternateName": "Menew for Mac", "operatingSystem": "macOS", "url": "https://menew.web.app/", "offers": {"@type": "Offer", "price": "0", "priceCurrency": "USD"}}, "dateModified": "2026-11-11"}, {"@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Menew", "item": "https://menew.web.app/"}, {"@type": "ListItem", "position": 2, "name": "Comparisons", "item": "https://menew.web.app/vs"}, {"@type": "ListItem", "position": 3, "name": "Menew vs Maccy and Paste", "item": "https://menew.web.app/vs/maccy"}]}]}</script>
<script type="application/ld+json">{"@context": "https://schema.org", "@graph": [{"@type": "WebPage", "name": "Menew vs Maccy and Paste: a free clipboard manager for Mac, and more", "url": "https://menew.web.app/vs/maccy", "description": "How Menew's clipboard history compares with Maccy and Paste: search, pins, snippets, paste queue and privacy. Free and open source.", "inLanguage": "en", "about": {"@type": "SoftwareApplication", "name": "Menew", "alternateName": "Menew for Mac", "operatingSystem": "macOS", "url": "https://menew.web.app/", "offers": {"@type": "Offer", "price": "0", "priceCurrency": "USD"}}, "dateModified": "2026-11-12"}, {"@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Menew", "item": "https://menew.web.app/"}, {"@type": "ListItem", "position": 2, "name": "Comparisons", "item": "https://menew.web.app/vs"}, {"@type": "ListItem", "position": 3, "name": "Menew vs Maccy and Paste", "item": "https://menew.web.app/vs/maccy"}]}]}</script>
<script data-goatcounter="https://menew.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
<style>
:root {
Expand Down
2 changes: 1 addition & 1 deletion docs/vs/otter/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<link rel="canonical" href="https://menew.web.app/vs/otter">
<link rel="icon" type="image/png" href="/assets/icon.png">
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
<script type="application/ld+json">{"@context": "https://schema.org", "@graph": [{"@type": "WebPage", "name": "Menew vs Otter and Granola: private meeting minutes on your Mac", "url": "https://menew.web.app/vs/otter", "description": "How Menew's recordings compare with Otter and Granola: on-device transcription, meeting minutes, tasks and privacy, with no bot and no account.", "inLanguage": "en", "about": {"@type": "SoftwareApplication", "name": "Menew", "alternateName": "Menew for Mac", "operatingSystem": "macOS", "url": "https://menew.web.app/", "offers": {"@type": "Offer", "price": "0", "priceCurrency": "USD"}}, "dateModified": "2026-11-11"}, {"@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Menew", "item": "https://menew.web.app/"}, {"@type": "ListItem", "position": 2, "name": "Comparisons", "item": "https://menew.web.app/vs"}, {"@type": "ListItem", "position": 3, "name": "Menew vs Otter and Granola", "item": "https://menew.web.app/vs/otter"}]}]}</script>
<script type="application/ld+json">{"@context": "https://schema.org", "@graph": [{"@type": "WebPage", "name": "Menew vs Otter and Granola: private meeting minutes on your Mac", "url": "https://menew.web.app/vs/otter", "description": "How Menew's recordings compare with Otter and Granola: on-device transcription, meeting minutes, tasks and privacy, with no bot and no account.", "inLanguage": "en", "about": {"@type": "SoftwareApplication", "name": "Menew", "alternateName": "Menew for Mac", "operatingSystem": "macOS", "url": "https://menew.web.app/", "offers": {"@type": "Offer", "price": "0", "priceCurrency": "USD"}}, "dateModified": "2026-11-12"}, {"@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Menew", "item": "https://menew.web.app/"}, {"@type": "ListItem", "position": 2, "name": "Comparisons", "item": "https://menew.web.app/vs"}, {"@type": "ListItem", "position": 3, "name": "Menew vs Otter and Granola", "item": "https://menew.web.app/vs/otter"}]}]}</script>
<script data-goatcounter="https://menew.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
<style>
:root {
Expand Down
Loading
Loading