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
8 changes: 8 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: 💬 Questions & ideas
url: https://github.com/SKemenov/MinimalCountdown/discussions
about: Ask a question or share an idea in Discussions
- name: ℹ️ About Minimal Countdown
url: https://github.com/SKemenov/MinimalCountdown
about: Features, screenshots, and install guide in the README
6 changes: 3 additions & 3 deletions .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
name: Feature request
name: "\U0001F4A1 Feature request"
about: Suggest an idea for this project
title: ''
labels: ''
title: "[FR] "
labels: enhancement
assignees: ''

---
Expand Down
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/macos-bug-report.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
---
name: MacOS Bug report
name: "\U0001FAB2 Bug report"
about: Create a report to help us improve
title: "[BUG] "
labels: ''
labels: bug
assignees: ''

---
Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@
/.build
/Packages
xcuserdata/
DerivedData/
DerivedData/

# Local release staging (published to GitHub Releases, not committed)
/Releases
29 changes: 17 additions & 12 deletions MinimalCountdown.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
Persistence/Stores/MigratingLoader.swift,
Persistence/Stores/MockInMemoryLocalStore.swift,
Resources/Assets.xcassets,
Resources/InfoPlist.xcstrings,
Resources/Localizable.xcstrings,
Resources/Resources.swift,
Views/Countdown/CountdownView.swift,
Expand Down Expand Up @@ -421,6 +422,8 @@
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "Minimal Countdown";
SDKROOT = macosx;
SHARED_BUILD_NUMBER = 26;
SHARED_VERSION_NUMBER = 2.0.0;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
};
Expand Down Expand Up @@ -481,6 +484,8 @@
MTL_FAST_MATH = YES;
PRODUCT_NAME = "Minimal Countdown";
SDKROOT = macosx;
SHARED_BUILD_NUMBER = 26;
SHARED_VERSION_NUMBER = 2.0.0;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_EMIT_LOC_STRINGS = YES;
Expand All @@ -494,7 +499,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = "$(SHARED_BUILD_NUMBER)";
DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = MinimalCountdown/Info.plist;
Expand All @@ -505,7 +510,7 @@
INFOPLIST_KEY_NSPrincipalClass = MinimalCountdown.MinimalCountdownView;
INSTALL_PATH = "$(HOME)/Library/Screen Savers";
MACOSX_DEPLOYMENT_TARGET = 14.6;
MARKETING_VERSION = 1.0;
MARKETING_VERSION = "$(SHARED_VERSION_NUMBER)";
PRODUCT_BUNDLE_IDENTIFIER = com.skemenov.MinimalCountdown;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
Expand All @@ -522,7 +527,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = "$(SHARED_BUILD_NUMBER)";
DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = MinimalCountdown/Info.plist;
Expand All @@ -533,7 +538,7 @@
INFOPLIST_KEY_NSPrincipalClass = MinimalCountdown.MinimalCountdownView;
INSTALL_PATH = "$(HOME)/Library/Screen Savers";
MACOSX_DEPLOYMENT_TARGET = 14.6;
MARKETING_VERSION = 1.0;
MARKETING_VERSION = "$(SHARED_VERSION_NUMBER)";
PRODUCT_BUNDLE_IDENTIFIER = com.skemenov.MinimalCountdown;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
Expand All @@ -549,7 +554,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = "$(SHARED_BUILD_NUMBER)";
DEAD_CODE_STRIPPING = YES;
ENABLE_APP_SANDBOX = NO;
ENABLE_HARDENED_RUNTIME = NO;
Expand All @@ -561,7 +566,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 26.4;
MARKETING_VERSION = 1.0;
MARKETING_VERSION = "$(SHARED_VERSION_NUMBER)";
PRODUCT_BUNDLE_IDENTIFIER = com.skemenov.MinimalDevApp;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = YES;
Expand All @@ -581,7 +586,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = "$(SHARED_BUILD_NUMBER)";
DEAD_CODE_STRIPPING = YES;
ENABLE_APP_SANDBOX = NO;
ENABLE_HARDENED_RUNTIME = NO;
Expand All @@ -593,7 +598,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 26.4;
MARKETING_VERSION = 1.0;
MARKETING_VERSION = "$(SHARED_VERSION_NUMBER)";
PRODUCT_BUNDLE_IDENTIFIER = com.skemenov.MinimalDevApp;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = YES;
Expand All @@ -610,11 +615,11 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = "$(SHARED_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 3LKWW87KA9;
GENERATE_INFOPLIST_FILE = YES;
MACOSX_DEPLOYMENT_TARGET = 26.5;
MARKETING_VERSION = 1.0;
MARKETING_VERSION = "$(SHARED_VERSION_NUMBER)";
PRODUCT_BUNDLE_IDENTIFIER = com.skemenov.MinimalDevAppTests;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO;
Expand All @@ -633,11 +638,11 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
CURRENT_PROJECT_VERSION = "$(SHARED_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 3LKWW87KA9;
GENERATE_INFOPLIST_FILE = YES;
MACOSX_DEPLOYMENT_TARGET = 26.5;
MARKETING_VERSION = 1.0;
MARKETING_VERSION = "$(SHARED_VERSION_NUMBER)";
PRODUCT_BUNDLE_IDENTIFIER = com.skemenov.MinimalDevAppTests;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO;
Expand Down
45 changes: 45 additions & 0 deletions MinimalCountdown/Resources/InfoPlist.xcstrings
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"sourceLanguage" : "en",
"strings" : {
"CFBundleDisplayName" : {
"comment" : "Bundle display name — keep 'Minimal Countdown' (with space) in every language.",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimal Countdown"
}
}
},
"shouldTranslate" : false
},
"CFBundleName" : {
"comment" : "Bundle name shown in System Settings — keep 'Minimal Countdown' (with space) in every language.",
"extractionState" : "manual",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Minimal Countdown"
}
}
},
"shouldTranslate" : false
},
"NSHumanReadableCopyright" : {
"comment" : "Copyright (human-readable)",
"extractionState" : "extracted_with_value",
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "new",
"value" : ""
}
}
},
"shouldTranslate" : false
}
},
"version" : "1.0"
}
73 changes: 73 additions & 0 deletions MinimalDevApp/Previews/ScreenshotPreviews.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
//
// ScreenshotPreviews.swift
// MinimalDevApp
//
// Created by Sergey Kemenov
//

// README screenshot sources. Render each #Preview (Xcode canvas or RenderPreview),
// then crop the window title bar for the full-bleed countdown shots. Filenames map to
// vendors/mc-screenshot-*.png.
// Use Figma to generate final images:
// https://www.figma.com/design/7f6nLbnA7hD8v6c6GrlwWh/Screensaver-Mockups

#if DEBUG
import SwiftUI

// vendors/mc-screenshot-01s — classic, all units, default look
#Preview("Classic") {
CountdownWindow(now: Date(), settings: .default, isPreview: true)
.frame(width: 1024, height: 730)
}

// vendors/mc-screenshot-02s — days-only, cyan, with a message
#Preview("Cyan — days only") {
CountdownWindow(
now: Date(),
settings: SaverSettings(
appearance: .init(style: .days, isLabelHidden: false),
schedule: .init(target: Date(timeIntervalSinceNow: 26 * 86400 + 3600)),
theme: .init(accent: .cyan, background: .black, brightness: .high, effect: .none, effectColor: .cyan),
typography: .init(weight: .bold, isRounded: false, numeralSystem: .automatic),
language: .automatic,
title: .init(text: "See you soon", isHidden: false)
),
isPreview: true
)
.frame(width: 1024, height: 730)
}

// vendors/mc-screenshot-03s — amber glow with a title
#Preview("Amber glow") {
CountdownWindow(
now: Date(),
settings: SaverSettings(
appearance: .init(style: .seconds, isLabelHidden: false),
schedule: .init(target: Date(timeIntervalSinceNow: 2 * 86400 + 16 * 3600 + 27 * 60 + 2)),
theme: .init(accent: .yellow, background: .black, brightness: .high, effect: .glow, effectColor: .yellow),
typography: .init(weight: .ultraLight, isRounded: false, numeralSystem: .automatic),
language: .automatic,
title: .init(text: "WWDC", isHidden: false)
),
isPreview: true
)
.frame(width: 1024, height: 730)
}

// vendors/mc-screenshot-04s — backlight effect, bold rounded digits, pink
#Preview("Pink — backlight") {
CountdownWindow(
now: Date(),
settings: SaverSettings(
appearance: .init(style: .seconds, isLabelHidden: false),
schedule: .init(target: Date(timeIntervalSinceNow: 7 * 86400 + 3600)),
theme: .init(accent: .pink, background: .black, brightness: .high, effect: .backlight, effectColor: .pink),
typography: .init(weight: .bold, isRounded: true, numeralSystem: .automatic),
language: .automatic,
title: .init(text: "", isHidden: true)
),
isPreview: false
)
.frame(width: 1024, height: 730)
}
#endif
43 changes: 24 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,38 +1,43 @@
## Minimal Countdown screensaver (macOS) v1.1
## Minimal Countdown screensaver (macOS) v2.0.0

Minimal Countdown is a minimalistic countdown screen saver for macOS. Shows the timer while you take a rest for a while.
Minimal Countdown is a minimalistic countdown screen saver for macOS. It counts down to — or up from — a date you choose, ticking quietly while your Mac rests.

Last release notes [read here](https://github.com/SKemenov/MinimalCountdown/releases).

<p align="center">
<img src="vendors/mc-screenshot-03s.png" width="49%"/>
<img src="vendors/mc-screenshot-01s.png" width="49%"/>
<img src="vendors/mc-screenshot-02s.png" width="49%"/>
<img src="vendors/mc-screenshot-03s.png" width="49%"/>
<img src="vendors/mc-screenshot-04s.png" width="49%"/>
<img src="vendors/mc-screenshot-05s.png" width="49%"/>
</p>



## Features

- [x] Use `Options...` to customize the screen saver
- [x] Set the date and time for your timer (if the date is in the past, the timer increases)
- [x] Add a short message to display above the timer
- [x] Show or hide the message
- [x] Change text color
- [x] Dim the color if you like
- [x] Select a style for your timer to display days, hours, minutes and even seconds
- [x] Localization - English
- [x] The totally redesigned Settings window, opened from `Options…`, allows you to customize the screensaver as you want
- [x] The screensaver's now using a separate file to store its settings; you may duplicate it across multiple Macs.
- [x] Set the target date and time — counts down to a future date, counts up from a past one (Stopwatch mode), and switches to Stopwatch automatically when it reaches zero
- [x] The date range has been extended to more than two years (actually, up to 999 days before or after today)
- [x] Add a short title above the timer, you may also show or hide it
- [x] Choose what to show — days, hours, minutes, and seconds — and optionally hide the unit labels as well
- [x] Use one of 11 accent colors for the screensaver
- [x] Three brightness levels to dim the digits to taste
- [x] Apply new digit effects — `blur`, `inner glow`, `backlight`, or `glow` — with a custom effect color or select `none` if you prefer classic
- [x] Adjust the digit font weight and switch to rounded digits
- [x] Choose a numeral system (Western, Eastern Arabic, and more)
- [x] Localized in 10 languages — English, Spanish, German, French, Russian, Hebrew, Arabic, Persian, Hindi, and Sanskrit
- [x] The settings window supports right-to-left localized languages

## Compatibility
Minimal Countdowns screen saver requires OS X Ventura or later.
Minimal Countdown requires macOS Sonoma or later.


## Stack
`Swift only`, `no storyboards`, `AppKit`, `ScreenSaver`, `ScreenSaverDefaults`
`Swift`, `SwiftUI`, `ScreenSaver`, `Swift Testing`

## Downloads
### [Minimal Countdown Screen Saver (.zip)](https://github.com/SKemenov/MinimalCountdown/releases/download/1.1/MinimalCountdown.saver.zip)
### [Latest release →](https://github.com/SKemenov/MinimalCountdown/releases/latest)

## How to install
1. Unzip and install it (now without any Gatekeeper warnings)
Expand All @@ -42,14 +47,14 @@ Minimal Countdowns screen saver requires OS X Ventura or later.

## Configurations
<p align="center">
<img src="vendors/mc-screenshot-02s.png" width="84%"/>
<img src="vendors/mc-screenshot-05s.png" width="85%"/>
</p>


## How to re-install
1. Open `System Settings` → `Wallpaper` → `Screen Saver…` button (macOS Tahoe)
or `System Settings` → `Screen Saver` (macOS Ventura–Sequoia)
2. Right-click MinimalCountdown → `Delete "MinimalCountdown"` → `Move to Trash`
or `System Settings` → `Screen Saver` (macOS Sonoma–Sequoia)
2. Right-click Minimal Countdown → `Delete "Minimal Countdown"` → `Move to Trash`
3. Close `System Settings`
4. Run `killall WallpaperAgent` in Terminal (or just restart your computer)
5. Install the new version of `MinimalCountdown.saver`
Expand All @@ -58,8 +63,8 @@ Minimal Countdowns screen saver requires OS X Ventura or later.

## I appreciate your ideas!

- [Sam Soffes](https://github.com/soffes/Countdown)
- [Aerial](https://github.com/AerialScreensaver/ScreenSaverMinimal)
- [Mirko Fetter](https://github.com/mirkofetter/ScreenSaverMinimal/tree/master)
- [Eskil Gjerde Sviggum](https://github.com/Eskils/JellyfishSaver)
- [Sam Soffes](https://github.com/soffes/Countdown)
- `Apple docs`, `stack overflow` and `medium`.
Binary file removed vendors/configurations.png
Binary file not shown.
Binary file modified vendors/mc-screenshot-01s.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 vendors/mc-screenshot-02s.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 vendors/mc-screenshot-03s.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 vendors/mc-screenshot-04s.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 vendors/mc-screenshot-05s.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 removed vendors/screenshot.png
Binary file not shown.