diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ddeca82..030fe16 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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. diff --git a/README.md b/README.md index a597af8..9487e7c 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,8 @@

+

▶ Watch the 30-second demo

+ ## Highlights ### 🧠 Memory — ⌃⌥⌘K diff --git a/Sources/Menew/App.swift b/Sources/Menew/App.swift index f891f4b..af93e99 100644 --- a/Sources/Menew/App.swift +++ b/Sources/Menew/App.swift @@ -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") { diff --git a/Sources/Menew/VideoFrames.swift b/Sources/Menew/VideoFrames.swift new file mode 100644 index 0000000..e2435ed --- /dev/null +++ b/Sources/Menew/VideoFrames.swift @@ -0,0 +1,80 @@ +import AppKit +import SwiftUI + +/// `Menew --demo --video-frames `: 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) + } + } +} diff --git a/docs/assets/menew-demo-poster.jpg b/docs/assets/menew-demo-poster.jpg new file mode 100644 index 0000000..3cc6009 Binary files /dev/null and b/docs/assets/menew-demo-poster.jpg differ diff --git a/docs/assets/menew-demo.mp4 b/docs/assets/menew-demo.mp4 new file mode 100644 index 0000000..bb92ece Binary files /dev/null and b/docs/assets/menew-demo.mp4 differ diff --git a/docs/assets/menew-demo.webm b/docs/assets/menew-demo.webm new file mode 100644 index 0000000..a09a941 Binary files /dev/null and b/docs/assets/menew-demo.webm differ diff --git a/docs/de/index.html b/docs/de/index.html index 379a544..5a4fc09 100644 --- a/docs/de/index.html +++ b/docs/de/index.html @@ -24,7 +24,7 @@ - + @@ -194,6 +194,7 @@ .sub { color: var(--muted); font-size: 18px; max-width: 640px; } .center { text-align: center; } .center .sub { margin: 0 auto; } + .demo video { display: block; width: min(900px, 100%); aspect-ratio: 4 / 3; height: auto; margin: 34px auto 0; border-radius: 20px; box-shadow: var(--shadow); border: 1px solid var(--line); background: #2a1d5c; } /* Destaques: grade em blocos */ .bento { display: grid; grid-template-columns: repeat(6, 1fr); gap: 16px; margin-top: 48px; } @@ -450,6 +451,19 @@

Die Menüleiste deines Macs,
aufgeladen.

+
+
+
+
30-Sekunden-Tour
+

So sieht es aus

+
+ +
+
+
diff --git a/docs/es/index.html b/docs/es/index.html index 0f1874d..51d9cde 100644 --- a/docs/es/index.html +++ b/docs/es/index.html @@ -24,7 +24,7 @@ - + @@ -194,6 +194,7 @@ .sub { color: var(--muted); font-size: 18px; max-width: 640px; } .center { text-align: center; } .center .sub { margin: 0 auto; } + .demo video { display: block; width: min(900px, 100%); aspect-ratio: 4 / 3; height: auto; margin: 34px auto 0; border-radius: 20px; box-shadow: var(--shadow); border: 1px solid var(--line); background: #2a1d5c; } /* Destaques: grade em blocos */ .bento { display: grid; grid-template-columns: repeat(6, 1fr); gap: 16px; margin-top: 48px; } @@ -450,6 +451,19 @@

La barra de menús de tu Mac,
potenciada.

+
+
+
+
Recorrido de 30 segundos
+

Míralo en acción

+
+ +
+
+
diff --git a/docs/index.html b/docs/index.html index 0b2e3fb..3fc7ce9 100644 --- a/docs/index.html +++ b/docs/index.html @@ -34,7 +34,7 @@ })(); - + @@ -204,6 +204,7 @@ .sub { color: var(--muted); font-size: 18px; max-width: 640px; } .center { text-align: center; } .center .sub { margin: 0 auto; } + .demo video { display: block; width: min(900px, 100%); aspect-ratio: 4 / 3; height: auto; margin: 34px auto 0; border-radius: 20px; box-shadow: var(--shadow); border: 1px solid var(--line); background: #2a1d5c; } /* Destaques: grade em blocos */ .bento { display: grid; grid-template-columns: repeat(6, 1fr); gap: 16px; margin-top: 48px; } @@ -460,6 +461,19 @@

Your Mac's menu bar,
supercharged.

+
+
+
+
30-second tour
+

See it in action

+
+ +
+
+
diff --git a/docs/llms.txt b/docs/llms.txt index b4c5f11..8b0f554 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -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 diff --git a/docs/pt/index.html b/docs/pt/index.html index 315ad86..7c54662 100644 --- a/docs/pt/index.html +++ b/docs/pt/index.html @@ -24,7 +24,7 @@ - + @@ -194,6 +194,7 @@ .sub { color: var(--muted); font-size: 18px; max-width: 640px; } .center { text-align: center; } .center .sub { margin: 0 auto; } + .demo video { display: block; width: min(900px, 100%); aspect-ratio: 4 / 3; height: auto; margin: 34px auto 0; border-radius: 20px; box-shadow: var(--shadow); border: 1px solid var(--line); background: #2a1d5c; } /* Destaques: grade em blocos */ .bento { display: grid; grid-template-columns: repeat(6, 1fr); gap: 16px; margin-top: 48px; } @@ -450,6 +451,19 @@

A barra de menus do seu Mac,
turbinada.

+
+
+
+
Tour de 30 segundos
+

Veja funcionando

+
+ +
+
+
diff --git a/docs/sitemap.xml b/docs/sitemap.xml index d3c49c3..cb35e81 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -2,7 +2,7 @@ https://menew.web.app/ - 2026-11-11 + 2026-11-12 @@ -11,7 +11,7 @@ https://menew.web.app/pt - 2026-11-11 + 2026-11-12 @@ -20,7 +20,7 @@ https://menew.web.app/de - 2026-11-11 + 2026-11-12 @@ -29,7 +29,7 @@ https://menew.web.app/es - 2026-11-11 + 2026-11-12 @@ -38,7 +38,7 @@ https://menew.web.app/zh - 2026-11-11 + 2026-11-12 @@ -47,30 +47,30 @@ https://menew.web.app/vs - 2026-11-11 + 2026-11-12 https://menew.web.app/vs/raycast - 2026-11-11 + 2026-11-12 https://menew.web.app/vs/maccy - 2026-11-11 + 2026-11-12 https://menew.web.app/vs/rectangle - 2026-11-11 + 2026-11-12 https://menew.web.app/vs/istat-menus - 2026-11-11 + 2026-11-12 https://menew.web.app/vs/cleanshot - 2026-11-11 + 2026-11-12 https://menew.web.app/vs/otter - 2026-11-11 + 2026-11-12 diff --git a/docs/vs/cleanshot/index.html b/docs/vs/cleanshot/index.html index 221f83c..c63364b 100644 --- a/docs/vs/cleanshot/index.html +++ b/docs/vs/cleanshot/index.html @@ -15,7 +15,7 @@ - +