diff --git a/Rsync Studio/Info.plist b/Rsync Studio/Info.plist
index 92a0a7f..5450062 100644
--- a/Rsync Studio/Info.plist
+++ b/Rsync Studio/Info.plist
@@ -22,8 +22,14 @@
$(MACOSX_DEPLOYMENT_TARGET)
RsyncStudioLicenseAPIBaseURL
- https://rsync.vm/api/
+ https://rsync.stage.absdev.net/api/
RsyncStudioLicensePublicKey
- 8/rlCrS5mVEi4rGNXkw0Z22XkRpSH5+jPnD4f0GyV2k=
+ /QWCMp3he0bUM0VIYYmH9y1/BCncpUo4h/J8sM8gPKg=
+ RsyncStudioPurchaseURL
+ https://rsync.stage.absdev.net/buy
+ RsyncStudioPortalURL
+ https://rsync.stage.absdev.net/portal
+ RsyncStudioSupportURL
+ https://rsync.stage.absdev.net/support
diff --git a/Rsync Studio/Services/LicensingManager.swift b/Rsync Studio/Services/LicensingManager.swift
index 9df4c84..5f4d9d0 100644
--- a/Rsync Studio/Services/LicensingManager.swift
+++ b/Rsync Studio/Services/LicensingManager.swift
@@ -64,7 +64,7 @@ final class LicensingManager: ObservableObject {
}
}
- static let trialLengthDays = 30
+ static let trialLengthDays = 7
@Published private(set) var state: State = .trial(daysRemaining: trialLengthDays, expiresAt: Date().addingTimeInterval(TimeInterval(trialLengthDays * 86_400)))
@Published private(set) var installationID = ""
@@ -100,7 +100,7 @@ final class LicensingManager: ObservableObject {
case .trial(let days, let expiresAt):
return "\(days) day\(days == 1 ? "" : "s") remaining · ends \(expiresAt.formatted(date: .abbreviated, time: .omitted))"
case .expired:
- return "The 30-day evaluation period has ended. Activate a licence to continue using sync jobs."
+ return "The 7-day evaluation period has ended. Activate a licence to continue using sync jobs."
case .invalid(let message):
return message
}
diff --git a/Rsync Studio/Views/LicenseRequiredView.swift b/Rsync Studio/Views/LicenseRequiredView.swift
index b364fed..a9e56dc 100644
--- a/Rsync Studio/Views/LicenseRequiredView.swift
+++ b/Rsync Studio/Views/LicenseRequiredView.swift
@@ -1,4 +1,5 @@
import SwiftUI
+import AppKit
struct LicenseRequiredView: View {
@EnvironmentObject private var licensing: LicensingManager
@@ -19,9 +20,13 @@ struct LicenseRequiredView: View {
.frame(maxWidth: 520)
}
- Button("Open Licence Settings") { openSettings() }
- .buttonStyle(.borderedProminent)
- .controlSize(.large)
+ HStack(spacing: 12) {
+ Button("Buy Rsync Studio…") { openPurchasePage() }
+ .buttonStyle(.borderedProminent)
+ .controlSize(.large)
+ Button("Open Licence Settings") { openSettings() }
+ .controlSize(.large)
+ }
Text("Your jobs and history remain on this Mac. Rsync Studio does not delete local data when a trial expires or a licence is removed.")
.font(.caption)
@@ -33,4 +38,11 @@ struct LicenseRequiredView: View {
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(nsColor: .windowBackgroundColor))
}
+
+ private func openPurchasePage() {
+ guard let raw = Bundle.main.object(forInfoDictionaryKey: "RsyncStudioPurchaseURL") as? String,
+ let url = URL(string: raw),
+ url.scheme?.lowercased() == "https" else { return }
+ NSWorkspace.shared.open(url)
+ }
}
diff --git a/Rsync Studio/Views/LicenseView.swift b/Rsync Studio/Views/LicenseView.swift
index 451e2c2..8ae4fbc 100644
--- a/Rsync Studio/Views/LicenseView.swift
+++ b/Rsync Studio/Views/LicenseView.swift
@@ -1,4 +1,5 @@
import SwiftUI
+import AppKit
struct LicenseView: View {
@EnvironmentObject private var licensing: LicensingManager
@@ -60,7 +61,8 @@ struct LicenseView: View {
showingTokenEntry.toggle()
}
}
- Text("Online activation will be enabled when the licensing service URL is configured. Signed offline licence tokens can be installed without contacting a server.")
+ Button("Buy Rsync Studio…") { openPurchasePage() }
+ Text("Buy Personal or Professional online, then enter the licence key delivered to your email. Signed offline licence tokens can also be installed without contacting the activation server.")
.font(.caption)
.foregroundStyle(.secondary)
}
@@ -130,4 +132,14 @@ struct LicenseView: View {
showingTokenEntry = false
} catch { errorMessage = error.localizedDescription }
}
+
+ private func openPurchasePage() {
+ guard let raw = Bundle.main.object(forInfoDictionaryKey: "RsyncStudioPurchaseURL") as? String,
+ let url = URL(string: raw),
+ url.scheme?.lowercased() == "https" else {
+ errorMessage = "The Rsync Studio purchase page is not configured in this build."
+ return
+ }
+ NSWorkspace.shared.open(url)
+ }
}