diff --git a/CLAUDE.md b/CLAUDE.md index a7b5aa6..7eddb2b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -97,7 +97,7 @@ pmset -g assertions | grep Vigil - **LSUIElement = YES**: No Dock icon, no Cmd+Tab. The app only appears in the menu bar and Activity Monitor. - **Sandbox enabled**: IOPMAssertion is sandbox-compatible — no special entitlements needed. Confirmed working in sandboxed Release + TestFlight builds. -- **App icon vs menu bar icon**: Two separate assets. App icon (1024px character artwork) shows in Finder. Menu bar icon (18px) shows in the menu bar strip. +- **App icon vs menu bar icon**: Two separate assets. App icon (1024px lighthouse artwork) shows in Finder. Menu bar icon (18px monochrome template) shows in the menu bar strip. - **Assertion lifecycle**: The OS automatically releases all IOPMAssertions if the app crashes — no leaked assertions possible. - **Verify it works**: `pmset -g assertions | grep Vigil` shows the active assertion type and reason string. - **No colons in PRODUCT_NAME**: Apple rejects `.app` bundles with `:` in the name (ITMS-90267). The App Store display name can have colons/dashes, but PRODUCT_NAME must not. diff --git a/CREDITS b/CREDITS index 05eec03..4cfe2ce 100644 --- a/CREDITS +++ b/CREDITS @@ -1,6 +1,2 @@ # Credits -## Icons - -App icon based on "Awake" icon created by Freepik - Flaticon -https://www.flaticon.com/free-icons/awake diff --git a/DESIGN.md b/DESIGN.md index e6a3eca..30208e4 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -15,7 +15,7 @@ A utility earns trust by being: - **Quiet** — it stays out of the way until needed. - **Obvious** — no learning curve, no surprises. -Vigil's only personality is the character icon. That icon carries the entire brand. Everything around it is system-native — invisible scaffolding that lets the icon and the primary toggle speak. +Vigil's only personality is the lighthouse icon. That icon carries the entire brand. Everything around it is system-native — invisible scaffolding that lets the icon and the primary toggle speak. --- @@ -35,7 +35,7 @@ Every pixel of visual weight must be earned. The hierarchy: | Weight | Element | Why it earns weight | |--------|---------|-------------------| -| Heaviest | Character icon | Brand identity — the one thing that's "Vigil" | +| Heaviest | Lighthouse icon | Brand identity — the one thing that's "Vigil" | | Heavy | Primary toggle | The reason the app exists | | Medium | Mode selector | Modifies how the primary action works | | Light | Settings rows | Used once, then forgotten | @@ -45,7 +45,7 @@ Nothing outside this hierarchy gets visual weight. No decorative elements. No bo ### 3. One Personality Element -The character icon is Vigil's single personality element. It's playful, distinctive, and recognizable. **Everything else is invisible.** System fonts, system controls, system colors. The moment a second element competes for personality — a custom toggle, a branded color, a non-standard font — the interface becomes noisy and the icon loses its power. +The lighthouse icon is Vigil's single personality element. It's distinctive and recognizable. **Everything else is invisible.** System fonts, system controls, system colors. The moment a second element competes for personality — a custom toggle, a branded color, a non-standard font — the interface becomes noisy and the icon loses its power. ### 4. State as Reward diff --git a/PRD.md b/PRD.md index d69b78a..3968229 100644 --- a/PRD.md +++ b/PRD.md @@ -40,7 +40,7 @@ - [ ] Notarized DMG for direct download ## Resolved Decisions -1. **Icon design**: Custom character artwork — full opacity when active, dimmed when inactive (menu bar + popover hero) +1. **Icon design**: Custom lighthouse artwork — full opacity when active, dimmed when inactive (popover hero) 2. **Sleep modes**: Two presets — "Display & System" and "System Only" — one active at a time 3. **Notifications (MVP)**: None — icon state change is sufficient for user-initiated toggles. Notifications reserved for timer expiry (v0.3) 4. **Quit while active**: No confirmation dialog — just quit and release diff --git a/README.md b/README.md index ac027b7..9f235ce 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,3 @@ pid 1234(Vigil): PreventUserIdleDisplaySleep named: "Vigil is keeping your Mac a Swift 6, SwiftUI, zero third-party dependencies. ~300 lines of code across three files. -## Credits - -App icon based on "Awake" icon created by [Freepik - Flaticon](https://www.flaticon.com/free-icons/awake). diff --git a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_128x128.png b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_128x128.png index 4ea2eba..33f7c6f 100644 Binary files a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_128x128.png and b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_128x128.png differ diff --git a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png index fe5a0c1..b31efa1 100644 Binary files a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png and b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png differ diff --git a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_16x16.png b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_16x16.png index 6a2d051..f89116a 100644 Binary files a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_16x16.png and b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_16x16.png differ diff --git a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png index 2316fc3..16b6744 100644 Binary files a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png and b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png differ diff --git a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_256x256.png b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_256x256.png index fe5a0c1..b31efa1 100644 Binary files a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_256x256.png and b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_256x256.png differ diff --git a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png index af67d7b..0a616e4 100644 Binary files a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png and b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png differ diff --git a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_32x32.png b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_32x32.png index 2316fc3..16b6744 100644 Binary files a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_32x32.png and b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_32x32.png differ diff --git a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png index b2472a2..819fe79 100644 Binary files a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png and b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png differ diff --git a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_512x512.png b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_512x512.png index af67d7b..0a616e4 100644 Binary files a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_512x512.png and b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_512x512.png differ diff --git a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png index 749074d..0299496 100644 Binary files a/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png and b/app/Vigil/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png differ diff --git a/app/Vigil/Assets.xcassets/MenuBarIcon.imageset/Contents.json b/app/Vigil/Assets.xcassets/MenuBarIcon.imageset/Contents.json index 7a24f29..d5f48ae 100644 --- a/app/Vigil/Assets.xcassets/MenuBarIcon.imageset/Contents.json +++ b/app/Vigil/Assets.xcassets/MenuBarIcon.imageset/Contents.json @@ -17,6 +17,6 @@ }, "properties" : { "preserves-vector-representation" : false, - "template-rendering-intent" : "original" + "template-rendering-intent" : "template" } } diff --git a/app/Vigil/Assets.xcassets/MenuBarIcon.imageset/menubar_icon.png b/app/Vigil/Assets.xcassets/MenuBarIcon.imageset/menubar_icon.png index 33c5e5a..3ba49df 100644 Binary files a/app/Vigil/Assets.xcassets/MenuBarIcon.imageset/menubar_icon.png and b/app/Vigil/Assets.xcassets/MenuBarIcon.imageset/menubar_icon.png differ diff --git a/app/Vigil/Assets.xcassets/MenuBarIcon.imageset/menubar_icon@2x.png b/app/Vigil/Assets.xcassets/MenuBarIcon.imageset/menubar_icon@2x.png index bc3eab5..dce7e47 100644 Binary files a/app/Vigil/Assets.xcassets/MenuBarIcon.imageset/menubar_icon@2x.png and b/app/Vigil/Assets.xcassets/MenuBarIcon.imageset/menubar_icon@2x.png differ diff --git a/app/Vigil/MenuBarView.swift b/app/Vigil/MenuBarView.swift index 750bf0a..a1d33ce 100644 --- a/app/Vigil/MenuBarView.swift +++ b/app/Vigil/MenuBarView.swift @@ -33,11 +33,12 @@ struct MenuBarView: View { // MARK: - Hero private var heroSection: some View { - VStack(spacing: 8) { - Image("MenuBarIcon") + VStack(spacing: 4) { + Image(nsImage: NSApplication.shared.applicationIconImage) .resizable() .scaledToFit() - .frame(height: 48) + .frame(height: 80) + .clipShape(RoundedRectangle(cornerRadius: 16)) .opacity(sleepManager.isActive ? 1.0 : 0.4) .animation(.spring(duration: 0.25), value: sleepManager.isActive) @@ -55,7 +56,7 @@ struct MenuBarView: View { } Text(sleepManager.isActive ? "Sleep prevention is on" : "Sleep prevention is off") - .font(.subheadline) + .font(.caption) .foregroundStyle(.secondary) } .padding() @@ -99,7 +100,7 @@ struct MenuBarView: View { private var settingsSection: some View { VStack(spacing: 0) { Toggle(isOn: $launchAtLogin) { - Label("Launch at Login", systemImage: "sunrise") + Text("Launch at Login") .frame(maxWidth: .infinity, alignment: .leading) } .onChange(of: launchAtLogin) { _, newValue in @@ -117,7 +118,7 @@ struct MenuBarView: View { get: { sleepManager.rememberLastState }, set: { sleepManager.rememberLastState = $0 } )) { - Label("Remember Last State", systemImage: "arrow.counterclockwise") + Text("Remember Last State") .frame(maxWidth: .infinity, alignment: .leading) } .padding(.vertical, 4) diff --git a/assets/appstore/one-click.png b/assets/appstore/one-click.png new file mode 100644 index 0000000..a224ea8 Binary files /dev/null and b/assets/appstore/one-click.png differ diff --git a/assets/appstore/two-modes.png b/assets/appstore/two-modes.png new file mode 100644 index 0000000..5fc321a Binary files /dev/null and b/assets/appstore/two-modes.png differ diff --git a/website/img/icon.png b/website/img/icon.png index af67d7b..0a616e4 100644 Binary files a/website/img/icon.png and b/website/img/icon.png differ diff --git a/website/img/scr1.png b/website/img/scr1.png index 384bfbb..2ee9c3e 100644 Binary files a/website/img/scr1.png and b/website/img/scr1.png differ diff --git a/website/img/scr2.png b/website/img/scr2.png index cc342aa..02bc40f 100644 Binary files a/website/img/scr2.png and b/website/img/scr2.png differ diff --git a/website/index.html b/website/index.html index 18200fe..3263afa 100644 --- a/website/index.html +++ b/website/index.html @@ -98,6 +98,7 @@

Most sleep prevention tools give you thirty features when all you needed was one click. +
Vigil is that one click.