diff --git a/README.md b/README.md index 798aa8d..bcc7cab 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,12 @@ Understand what your Mac is doing, without giving up your data.

+

+ Website · + Download beta · + Report an issue +

+

macOS 14+ Swift 5.9+ @@ -23,6 +29,10 @@ No account. No backend. No analytics. No automatic cleanup. > [!IMPORTANT] > Corewise is now available as a public beta. Download the signed, notarized universal DMG from [GitHub Releases](https://github.com/roccodaffuso/Corewise/releases/tag/v0.1.0-beta.2). GitHub's automatic “Source code” archives are not installable app downloads. +

+ Corewise Overview showing Focused Check, a cautious attention summary, and live local signals +

+ ## What Corewise does - **Focused Check** observes supported local signals when a Mac feels slow, hot, battery-hungry, or full, then returns a cautious explanation and one useful next step. @@ -34,6 +44,23 @@ No account. No backend. No analytics. No automatic cleanup. Corewise deliberately avoids health scores, process killing, automatic deletion, private sensor APIs, hidden folder scans, and claims of exact parity with Activity Monitor. +## Product tour + + + + + + + + + + +
+ Corewise AI Workloads observing attributable local Codex and Claude activity + + Corewise Storage showing startup-volume headroom and read-only analysis access +
AI Workloads
Separate direct app footprint, related local work, and shared hosts without pretending to count cloud agents.
Storage
See volume headroom first, then start an explicit read-only analysis with reusable permission.
+ ## Install the public beta 1. Download [`Corewise-0.1.0-universal.dmg`](https://github.com/roccodaffuso/Corewise/releases/download/v0.1.0-beta.2/Corewise-0.1.0-universal.dmg). diff --git a/docs/PUBLIC_RELEASE_AUDIT.md b/docs/PUBLIC_RELEASE_AUDIT.md index a4b0b9f..6ff839d 100644 --- a/docs/PUBLIC_RELEASE_AUDIT.md +++ b/docs/PUBLIC_RELEASE_AUDIT.md @@ -30,10 +30,20 @@ GitHub secret scanning, push protection, and private vulnerability reporting are `Package.swift` declares no third-party package dependencies. Corewise uses Swift, SwiftUI, AppKit/macOS frameworks, and repository-owned source only. There is no third-party notices bundle required for the current app. -The application icon is repository-owned and reproducibly generated by `script/generate_app_icon.swift`. `Sources/Corewise/Resources/Corewise.icns` is the packaged icon and `docs/assets/corewise-app-icon.png` is its public preview. The design-audit screenshot is produced from Corewise itself and contains no third-party artwork. +The application icon is repository-owned and reproducibly generated by `script/generate_app_icon.swift`. `Sources/Corewise/Resources/Corewise.icns` is the packaged icon and `docs/assets/corewise-app-icon.png` is its public preview. Public screenshots are captured from Corewise itself and contain no third-party artwork. The repository social preview is composed from those repository-owned screenshots by `script/generate_social_preview.swift`; it introduces no external font, stock image, or generated-art dependency. Contributor Covenant text is adapted from version 2.1 with attribution in `CODE_OF_CONDUCT.md`. +## GitHub public surface + +- Repository visibility is public; Issues are enabled and Discussions remain disabled. +- `corewise.dev` is the configured repository homepage and GitHub Pages enforces HTTPS for the apex and `www` domains. +- Secret scanning, push protection, and private vulnerability reporting are enabled. +- Bug and feature-request forms use existing `bug` and `enhancement` labels, disable blank issues, and route vulnerabilities to the private advisory form. +- GitHub recognizes MPL-2.0 from the default branch; `SECURITY.md`, `TRADEMARKS.md`, `CONTRIBUTING.md`, the Contributor Covenant, and the pull-request template are present. +- Protected `main` requires the ARM64 and Intel Swift/DMG checks plus resolved conversations; force-push and branch deletion are disabled. +- Account-level verification of `corewise.dev` remains a manual profile-settings step because the CLI token intentionally does not receive the broad `admin:org` scope. + ## Distribution boundary Release signing certificates, private keys, App Store Connect `.p8` files, notary credentials, submission logs containing account metadata, and Keychain exports must remain outside Git and release assets. diff --git a/docs/RELEASE_NOTES_0.1.0_BETA_2.md b/docs/RELEASE_NOTES_0.1.0_BETA_2.md new file mode 100644 index 0000000..6600b07 --- /dev/null +++ b/docs/RELEASE_NOTES_0.1.0_BETA_2.md @@ -0,0 +1,47 @@ +![Corewise — local-first macOS diagnostics](https://raw.githubusercontent.com/roccodaffuso/Corewise/main/docs/assets/corewise-social-preview.jpg) + +# Corewise 0.1.0 beta 2 + +Corewise is a free, open-source macOS 14+ utility for understanding performance, storage, and attributable local AI workloads without uploading diagnostics. + +**[Download the signed and notarized universal DMG](https://github.com/roccodaffuso/Corewise/releases/download/v0.1.0-beta.2/Corewise-0.1.0-universal.dmg)** + +## What you can explore + +- **Focused Check** — observe supported signals when your Mac feels slow, hot, battery-hungry, or full. +- **Performance** — inspect CPU, memory context, swap, and live process evidence as distinct views. +- **AI Workloads** — separate attributable app footprint, related local work, and shared hosts for supported tools such as Codex, Claude, Cursor, and Ollama. +- **Storage** — see startup-volume headroom and start an explicit read-only analysis with optional reusable Full Disk Access. +- **Local reports** — copy a cautious summary or Markdown report without uploading diagnostic data. + + + + + + +
Corewise OverviewCorewise AI Workloads
+ +## Beta 2 fix + +`⌘K` now reliably places keyboard focus in Quick Actions search before keyboard routing begins. + +## Privacy and limits + +- No account, telemetry, backend, analytics, or network collection. +- Full Disk Access is optional and used only for a user-started read-only Storage analysis. +- AI Workloads observes attributable local processes only. Cloud activity and logical agent counts are outside coverage. +- Corewise does not kill processes, delete files, or claim that one number represents Mac health. + +## Install + +1. Download `Corewise-0.1.0-universal.dmg` below. +2. Open the DMG and drag Corewise into Applications. +3. Open Corewise normally. The app is signed with Developer ID and notarized by Apple. + +SHA-256: + +```text +00444d9577db1b4708ab9ae6aa7a50bb55340b30bd5d978df2187ecb4d184389 +``` + +[Website](https://corewise.dev) · [Source](https://github.com/roccodaffuso/Corewise) · [MPL-2.0](https://github.com/roccodaffuso/Corewise/blob/main/LICENSE) · [Security](https://github.com/roccodaffuso/Corewise/security/policy) · [Report an issue](https://github.com/roccodaffuso/Corewise/issues/new/choose) diff --git a/docs/assets/corewise-ai-workloads.png b/docs/assets/corewise-ai-workloads.png new file mode 100644 index 0000000..2106133 Binary files /dev/null and b/docs/assets/corewise-ai-workloads.png differ diff --git a/docs/assets/corewise-overview.png b/docs/assets/corewise-overview.png index f6425f1..f4113b7 100644 Binary files a/docs/assets/corewise-overview.png and b/docs/assets/corewise-overview.png differ diff --git a/docs/assets/corewise-social-preview.jpg b/docs/assets/corewise-social-preview.jpg new file mode 100644 index 0000000..30f1b5e Binary files /dev/null and b/docs/assets/corewise-social-preview.jpg differ diff --git a/docs/assets/corewise-storage.png b/docs/assets/corewise-storage.png new file mode 100644 index 0000000..b4ae3d6 Binary files /dev/null and b/docs/assets/corewise-storage.png differ diff --git a/script/generate_social_preview.swift b/script/generate_social_preview.swift new file mode 100644 index 0000000..7053129 --- /dev/null +++ b/script/generate_social_preview.swift @@ -0,0 +1,206 @@ +#!/usr/bin/env swift +// SPDX-License-Identifier: MPL-2.0 + +import AppKit + +private let canvasSize = NSSize(width: 1_280, height: 640) + +private func color(_ hex: UInt32, alpha: CGFloat = 1) -> NSColor { + NSColor( + red: CGFloat((hex >> 16) & 0xff) / 255, + green: CGFloat((hex >> 8) & 0xff) / 255, + blue: CGFloat(hex & 0xff) / 255, + alpha: alpha + ) +} + +private func drawText( + _ text: String, + in rect: NSRect, + font: NSFont, + color: NSColor, + lineHeight: CGFloat? = nil +) { + let paragraph = NSMutableParagraphStyle() + paragraph.lineBreakMode = .byWordWrapping + if let lineHeight { + paragraph.minimumLineHeight = lineHeight + paragraph.maximumLineHeight = lineHeight + } + + text.draw( + in: rect, + withAttributes: [ + .font: font, + .foregroundColor: color, + .paragraphStyle: paragraph, + ] + ) +} + +private func drawSignalField() { + let accent = color(0x55D6D9) + + for index in 0..<6 { + let path = NSBezierPath() + path.lineWidth = index == 2 ? 2 : 1 + let baseY = CGFloat(80 + index * 92) + path.move(to: NSPoint(x: 0, y: baseY)) + + for x in stride(from: CGFloat(0), through: canvasSize.width, by: 16) { + let wave = sin((x / 72) + CGFloat(index) * 0.8) * CGFloat(8 + index * 2) + let pulse = exp(-pow((x - 470) / 115, 2)) * sin(x / 13) * 30 + path.line(to: NSPoint(x: x, y: baseY + wave + pulse)) + } + + accent.withAlphaComponent(index == 2 ? 0.16 : 0.055).setStroke() + path.stroke() + } + + for x in stride(from: CGFloat(44), through: canvasSize.width, by: 84) { + color(0x9FE9E8, alpha: 0.055).setFill() + NSBezierPath(ovalIn: NSRect(x: x, y: 30, width: 2, height: 2)).fill() + } +} + +private func drawBadge(_ text: String, x: CGFloat, width: CGFloat) { + let rect = NSRect(x: x, y: 72, width: width, height: 40) + let shape = NSBezierPath(roundedRect: rect, xRadius: 12, yRadius: 12) + color(0x55D6D9, alpha: 0.09).setFill() + shape.fill() + color(0x55D6D9, alpha: 0.24).setStroke() + shape.lineWidth = 1 + shape.stroke() + + drawText( + text, + in: NSRect(x: x + 15, y: 80, width: width - 30, height: 24), + font: .systemFont(ofSize: 15, weight: .semibold), + color: color(0xA9C3C2) + ) +} + +let arguments = CommandLine.arguments +guard arguments.count == 3 else { + FileHandle.standardError.write( + Data("Usage: swift script/generate_social_preview.swift \n".utf8) + ) + exit(64) +} + +guard let screenshot = NSImage(contentsOfFile: arguments[1]) else { + FileHandle.standardError.write(Data("Unable to read overview screenshot.\n".utf8)) + exit(66) +} + +guard + let bitmap = NSBitmapImageRep( + bitmapDataPlanes: nil, + pixelsWide: Int(canvasSize.width), + pixelsHigh: Int(canvasSize.height), + bitsPerSample: 8, + samplesPerPixel: 4, + hasAlpha: true, + isPlanar: false, + colorSpaceName: .deviceRGB, + bytesPerRow: 0, + bitsPerPixel: 0 + ), + let context = NSGraphicsContext(bitmapImageRep: bitmap) +else { + FileHandle.standardError.write(Data("Unable to create social preview canvas.\n".utf8)) + exit(70) +} + +NSGraphicsContext.saveGraphicsState() +NSGraphicsContext.current = context +context.imageInterpolation = .high + +NSGradient( + starting: color(0x061011), + ending: color(0x102322) +)?.draw(in: NSRect(origin: .zero, size: canvasSize), angle: 0) + +drawSignalField() + +let glow = NSBezierPath(ovalIn: NSRect(x: 420, y: 130, width: 620, height: 620)) +color(0x55D6D9, alpha: 0.045).setFill() +glow.fill() + +let screenshotRect = NSRect(x: 590, y: 62, width: 780, height: 542) +NSGraphicsContext.saveGraphicsState() +let shadow = NSShadow() +shadow.shadowColor = color(0x000000, alpha: 0.7) +shadow.shadowBlurRadius = 32 +shadow.shadowOffset = NSSize(width: 0, height: -14) +shadow.set() +let screenshotFrame = NSBezierPath(roundedRect: screenshotRect, xRadius: 25, yRadius: 25) +color(0x071011).setFill() +screenshotFrame.fill() +NSGraphicsContext.restoreGraphicsState() + +NSGraphicsContext.saveGraphicsState() +screenshotFrame.addClip() +screenshot.draw( + in: screenshotRect, + from: NSRect(origin: .zero, size: screenshot.size), + operation: .sourceOver, + fraction: 1, + respectFlipped: true, + hints: [.interpolation: NSImageInterpolation.high] +) +NSGraphicsContext.restoreGraphicsState() + +color(0x7AE3E3, alpha: 0.27).setStroke() +screenshotFrame.lineWidth = 1 +screenshotFrame.stroke() + +let accentLine = NSBezierPath() +accentLine.lineWidth = 3 +accentLine.move(to: NSPoint(x: 72, y: 566)) +accentLine.line(to: NSPoint(x: 156, y: 566)) +color(0x55D6D9).setStroke() +accentLine.stroke() + +drawText( + "COREWISE / LOCAL SIGNAL CONSOLE", + in: NSRect(x: 72, y: 526, width: 460, height: 28), + font: .systemFont(ofSize: 16, weight: .bold), + color: color(0x80DCDD) +) + +drawText( + "Know what your Mac is really doing.", + in: NSRect(x: 68, y: 278, width: 485, height: 225), + font: .systemFont(ofSize: 58, weight: .semibold), + color: color(0xF3F7F6), + lineHeight: 64 +) + +drawText( + "Local-first diagnostics for performance, storage, and AI workloads.", + in: NSRect(x: 72, y: 154, width: 440, height: 82), + font: .systemFont(ofSize: 22, weight: .regular), + color: color(0xA9B9B8), + lineHeight: 30 +) + +drawBadge("macOS 14+", x: 72, width: 125) +drawBadge("Open source", x: 211, width: 145) +drawBadge("Local by design", x: 370, width: 164) + +NSGraphicsContext.restoreGraphicsState() + +guard + let data = bitmap.representation(using: .jpeg, properties: [.compressionFactor: 0.88]) +else { + FileHandle.standardError.write(Data("Unable to render social preview.\n".utf8)) + exit(70) +} + +do { + try data.write(to: URL(fileURLWithPath: arguments[2]), options: .atomic) +} catch { + FileHandle.standardError.write(Data("Unable to write social preview: \(error)\n".utf8)) + exit(74) +}