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
27 changes: 27 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@
Understand what your Mac is doing, without giving up your data.
</p>

<p align="center">
<a href="https://corewise.dev">Website</a> ·
<a href="https://github.com/roccodaffuso/Corewise/releases/tag/v0.1.0-beta.2">Download beta</a> ·
<a href="https://github.com/roccodaffuso/Corewise/issues/new/choose">Report an issue</a>
</p>

<p align="center">
<img alt="macOS 14+" src="https://img.shields.io/badge/macOS-14%2B-1f6feb?style=flat-square">
<img alt="Swift 5.9+" src="https://img.shields.io/badge/Swift-5.9%2B-f05138?style=flat-square">
Expand All @@ -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.

<p align="center">
<img src="docs/assets/corewise-overview.png" alt="Corewise Overview showing Focused Check, a cautious attention summary, and live local signals">
</p>

## 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.
Expand All @@ -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

<table>
<tr>
<td width="50%">
<img src="docs/assets/corewise-ai-workloads.png" alt="Corewise AI Workloads observing attributable local Codex and Claude activity">
</td>
<td width="50%">
<img src="docs/assets/corewise-storage.png" alt="Corewise Storage showing startup-volume headroom and read-only analysis access">
</td>
</tr>
<tr>
<td><strong>AI Workloads</strong><br>Separate direct app footprint, related local work, and shared hosts without pretending to count cloud agents.</td>
<td><strong>Storage</strong><br>See volume headroom first, then start an explicit read-only analysis with reusable permission.</td>
</tr>
</table>

## 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).
Expand Down
12 changes: 11 additions & 1 deletion docs/PUBLIC_RELEASE_AUDIT.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
47 changes: 47 additions & 0 deletions docs/RELEASE_NOTES_0.1.0_BETA_2.md
Original file line number Diff line number Diff line change
@@ -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.

<table>
<tr>
<td width="50%"><img src="https://raw.githubusercontent.com/roccodaffuso/Corewise/main/docs/assets/corewise-overview.png" alt="Corewise Overview"></td>
<td width="50%"><img src="https://raw.githubusercontent.com/roccodaffuso/Corewise/main/docs/assets/corewise-ai-workloads.png" alt="Corewise AI Workloads"></td>
</tr>
</table>

## 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)
Binary file added docs/assets/corewise-ai-workloads.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/corewise-overview.png
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/corewise-social-preview.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/corewise-storage.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
206 changes: 206 additions & 0 deletions script/generate_social_preview.swift
Original file line number Diff line number Diff line change
@@ -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 <overview.png> <output.jpg>\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)
}