Selaa lähdekoodia

Wire legal links to Google Sites and consolidate StoreKit config.

Open marketing, privacy, terms, and support in Safari from Settings and the paywall; replace ProSubscriptions.storekit with Paywall.storekit and remove the redundant docs/ static site.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 3 viikkoa sitten
vanhempi
commit
1a1b3205c2

+ 1 - 1
App for Indeed.xcodeproj/xcshareddata/xcschemes/App for Indeed.xcscheme

@@ -52,7 +52,7 @@
52 52
          </BuildableReference>
53 53
       </BuildableProductRunnable>
54 54
       <StoreKitConfigurationFileReference
55
-         identifier = "../../App for Indeed/ProSubscriptions.storekit">
55
+         identifier = "../../App for Indeed/Paywall.storekit">
56 56
       </StoreKitConfigurationFileReference>
57 57
    </LaunchAction>
58 58
    <ProfileAction

+ 35 - 0
App for Indeed/AppLegalURLs.swift

@@ -0,0 +1,35 @@
1
+//
2
+//  AppLegalURLs.swift
3
+//  App for Indeed
4
+//
5
+
6
+import AppKit
7
+import Foundation
8
+
9
+/// Legal, support, and marketing pages hosted on Google Sites.
10
+enum AppLegalURLs {
11
+    private static let siteRoot = "https://sites.google.com/view/app-for-indeed"
12
+
13
+    static let marketingHome = URL(string: "\(siteRoot)/home")!
14
+    static let privacyPolicy = URL(string: "\(siteRoot)/privacy")!
15
+    static let termsOfUse = URL(string: "\(siteRoot)/terms")!
16
+    static let support = URL(string: "\(siteRoot)/support")!
17
+
18
+    /// Opens the URL in Safari when available; otherwise uses the system default browser.
19
+    static func openInSafari(_ url: URL) {
20
+        let safariApp = URL(fileURLWithPath: "/Applications/Safari.app")
21
+        guard FileManager.default.fileExists(atPath: safariApp.path) else {
22
+            NSWorkspace.shared.open(url)
23
+            return
24
+        }
25
+        NSWorkspace.shared.open(
26
+            [url],
27
+            withApplicationAt: safariApp,
28
+            configuration: NSWorkspace.OpenConfiguration()
29
+        ) { _, error in
30
+            if error != nil {
31
+                NSWorkspace.shared.open(url)
32
+            }
33
+        }
34
+    }
35
+}

+ 3 - 16
App for Indeed/Controllers/PremiumPlansWindowController.swift

@@ -896,28 +896,15 @@ private final class PremiumPlansViewController: NSViewController {
896 896
     }
897 897
 
898 898
     @objc private func didTapFooterPrivacyPolicy() {
899
-        presentFooterPlaceholderAlert(for: "Privacy Policy")
899
+        AppLegalURLs.openInSafari(AppLegalURLs.privacyPolicy)
900 900
     }
901 901
 
902 902
     @objc private func didTapFooterTermsOfServices() {
903
-        presentFooterPlaceholderAlert(for: "Terms of Services")
903
+        AppLegalURLs.openInSafari(AppLegalURLs.termsOfUse)
904 904
     }
905 905
 
906 906
     @objc private func didTapFooterSupport() {
907
-        presentFooterPlaceholderAlert(for: "Support")
908
-    }
909
-
910
-    private func presentFooterPlaceholderAlert(for featureName: String) {
911
-        let alert = NSAlert()
912
-        alert.messageText = "\(featureName) coming soon"
913
-        alert.informativeText = "This section is a placeholder for now."
914
-        alert.alertStyle = .informational
915
-        alert.addButton(withTitle: "OK")
916
-        if let window = view.window {
917
-            alert.beginSheetModal(for: window)
918
-        } else {
919
-            alert.runModal()
920
-        }
907
+        AppLegalURLs.openInSafari(AppLegalURLs.support)
921 908
     }
922 909
 
923 910
     private func loadStoreProducts() async {

+ 3 - 3
App for Indeed/ProSubscriptions.storekit

@@ -1,15 +1,15 @@
1 1
 {
2 2
   "appPolicies" : {
3
-    "eula" : "",
3
+    "eula" : "https://sites.google.com/view/app-for-indeed/terms",
4 4
     "policies" : [
5 5
       {
6 6
         "locale" : "en_US",
7 7
         "policyText" : "",
8
-        "policyURL" : ""
8
+        "policyURL" : "https://sites.google.com/view/app-for-indeed/privacy"
9 9
       }
10 10
     ]
11 11
   },
12
-  "identifier" : "ProSubscriptions",
12
+  "identifier" : "Paywall",
13 13
   "nonRenewingSubscriptions" : [
14 14
 
15 15
   ],

+ 2 - 2
App for Indeed/Subscription/SubscriptionProductIDs.swift

@@ -7,8 +7,8 @@ import Foundation
7 7
 
8 8
 /// Identifiers for auto-renewable subscriptions in App Store Connect.
9 9
 /// IDs may only contain letters, numbers, underscores, and periods (no hyphens).
10
-/// Keep these strings identical in code, `ProSubscriptions.storekit`, and App Store Connect.
11
-/// Local Xcode runs use `App for Indeed/ProSubscriptions.storekit` (Run scheme → Options → StoreKit Configuration).
10
+/// Keep these strings identical in code, `Paywall.storekit`, and App Store Connect.
11
+/// Local Xcode runs use `App for Indeed/Paywall.storekit` (Run scheme → Options → StoreKit Configuration).
12 12
 enum SubscriptionProductIDs {
13 13
     static let weekly = "com.mqldev.appforindeed.pro.weekly"
14 14
     static let monthly = "com.mqldev.appforindeed.pro.monthly"

+ 1 - 1
App for Indeed/Subscription/SubscriptionStore.swift

@@ -159,7 +159,7 @@ enum SubscriptionStoreError: LocalizedError {
159 159
         switch self {
160 160
         case .productUnavailable:
161 161
             return """
162
-            For local testing in Xcode: Product → Scheme → Edit Scheme → Run → Options → StoreKit Configuration → choose ProSubscriptions.storekit.
162
+            For local testing in Xcode: Product → Scheme → Edit Scheme → Run → Options → StoreKit Configuration → choose Paywall.storekit.
163 163
 
164 164
             For TestFlight / App Store: In App Store Connect, create auto-renewable subscriptions whose Product IDs exactly match SubscriptionProductIDs.swift (same spelling as com.mqldev.appforindeed.pro.*), then submit them with the app version.
165 165
             """

+ 8 - 16
App for Indeed/Views/DashboardView.swift

@@ -1521,6 +1521,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
1521 1521
         aboutTitle.alignment = .left
1522 1522
 
1523 1523
         let aboutSection = makeSettingsSection(rows: [
1524
+            makeSettingsRow(title: "Website", systemImage: "globe", accessory: nil, tapAction: #selector(didTapWebsite)),
1524 1525
             makeSettingsRow(title: "Support", systemImage: "questionmark.circle", accessory: nil, tapAction: #selector(didTapSupport)),
1525 1526
             makeSettingsRow(title: "Terms of Use", systemImage: "doc.text", accessory: nil, tapAction: #selector(didTapTermsOfUse)),
1526 1527
             makeSettingsRow(title: "Privacy Policy", systemImage: "shield", accessory: nil, tapAction: #selector(didTapPrivacyPolicy))
@@ -1875,29 +1876,20 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
1875 1876
         }
1876 1877
     }
1877 1878
 
1879
+    @objc private func didTapWebsite() {
1880
+        AppLegalURLs.openInSafari(AppLegalURLs.marketingHome)
1881
+    }
1882
+
1878 1883
     @objc private func didTapSupport() {
1879
-        presentSettingsPlaceholderAlert(for: "Support")
1884
+        AppLegalURLs.openInSafari(AppLegalURLs.support)
1880 1885
     }
1881 1886
 
1882 1887
     @objc private func didTapTermsOfUse() {
1883
-        presentSettingsPlaceholderAlert(for: "Terms of Use")
1888
+        AppLegalURLs.openInSafari(AppLegalURLs.termsOfUse)
1884 1889
     }
1885 1890
 
1886 1891
     @objc private func didTapPrivacyPolicy() {
1887
-        presentSettingsPlaceholderAlert(for: "Privacy Policy")
1888
-    }
1889
-
1890
-    private func presentSettingsPlaceholderAlert(for featureName: String) {
1891
-        let alert = NSAlert()
1892
-        alert.messageText = "\(featureName) coming soon"
1893
-        alert.informativeText = "This section is a placeholder for now."
1894
-        alert.alertStyle = .informational
1895
-        alert.addButton(withTitle: "OK")
1896
-        if let window {
1897
-            alert.beginSheetModal(for: window)
1898
-        } else {
1899
-            alert.runModal()
1900
-        }
1892
+        AppLegalURLs.openInSafari(AppLegalURLs.privacyPolicy)
1901 1893
     }
1902 1894
 
1903 1895
     private func focusSearchField(seed: String) {

+ 0 - 85
docs/index.html

@@ -1,85 +0,0 @@
1
-<!DOCTYPE html>
2
-<html lang="en">
3
-<head>
4
-  <meta charset="utf-8">
5
-  <meta name="viewport" content="width=device-width, initial-scale=1">
6
-  <title>App for Indeed — Job search, CVs, and profiles on Mac</title>
7
-  <meta name="description" content="App for Indeed helps you search jobs, save listings, build CVs from profiles, and browse Indeed listings — all from a native Mac app.">
8
-  <link rel="stylesheet" href="styles.css">
9
-</head>
10
-<body>
11
-  <header class="site-header">
12
-    <div class="site-header__inner">
13
-      <a class="brand" href="index.html">
14
-        <span class="brand__mark" aria-hidden="true">✦</span>
15
-        App for Indeed
16
-      </a>
17
-      <nav class="site-nav" aria-label="Primary">
18
-        <a href="index.html" aria-current="page">Home</a>
19
-        <a href="privacy.html">Privacy Policy</a>
20
-        <a href="terms.html">Terms of Service</a>
21
-      </nav>
22
-    </div>
23
-  </header>
24
-
25
-  <section class="hero">
26
-    <div class="hero__inner">
27
-      <h1>Your Indeed workflow, on Mac</h1>
28
-      <p class="lead">
29
-        Search jobs with an AI assistant, save listings, manage career profiles, and build polished CVs — in one native app designed for focus and speed.
30
-      </p>
31
-      <div class="cta-row">
32
-        <a class="button button--primary" href="https://apps.apple.com/app/id0000000000">Download on the Mac App Store</a>
33
-        <a class="button button--secondary" href="privacy.html">Privacy Policy</a>
34
-      </div>
35
-    </div>
36
-  </section>
37
-
38
-  <section class="features">
39
-    <div class="features__inner">
40
-      <h2>Everything you need to move faster</h2>
41
-      <div class="feature-grid">
42
-        <article class="feature-card">
43
-          <h3>AI job search</h3>
44
-          <p>Describe what you want in plain language. The assistant finds relevant listings and keeps context as you refine your search.</p>
45
-        </article>
46
-        <article class="feature-card">
47
-          <h3>Saved jobs</h3>
48
-          <p>Bookmark listings you care about and return to them from a dedicated saved-jobs view.</p>
49
-        </article>
50
-        <article class="feature-card">
51
-          <h3>Career profiles</h3>
52
-          <p>Store work history, skills, and details locally so you can reuse them across applications.</p>
53
-        </article>
54
-        <article class="feature-card">
55
-          <h3>CV maker</h3>
56
-          <p>Pick a template, merge profile data, and preview a print-ready CV without leaving the app.</p>
57
-        </article>
58
-        <article class="feature-card">
59
-          <h3>Indeed browsing</h3>
60
-          <p>Open listings and apply flows in an embedded browser so you stay in one window while you work.</p>
61
-        </article>
62
-        <article class="feature-card">
63
-          <h3>App for Indeed Pro</h3>
64
-          <p>Unlock premium features with weekly, monthly, or yearly subscriptions billed through your Apple ID.</p>
65
-        </article>
66
-      </div>
67
-    </div>
68
-  </section>
69
-
70
-  <p class="disclaimer">
71
-    App for Indeed is an independent Mac application and is not affiliated with, endorsed by, or sponsored by Indeed.com or Indeed, Inc. Indeed is a trademark of Indeed, Inc.
72
-  </p>
73
-
74
-  <footer class="page-footer">
75
-    <div class="page-footer__inner">
76
-      <p>© 2026 App for Indeed. All rights reserved.</p>
77
-      <nav aria-label="Footer">
78
-        <a href="privacy.html">Privacy</a>
79
-        <a href="terms.html">Terms</a>
80
-        <a href="index.html">Home</a>
81
-      </nav>
82
-    </div>
83
-  </footer>
84
-</body>
85
-</html>

+ 0 - 129
docs/privacy.html

@@ -1,129 +0,0 @@
1
-<!DOCTYPE html>
2
-<html lang="en">
3
-<head>
4
-  <meta charset="utf-8">
5
-  <meta name="viewport" content="width=device-width, initial-scale=1">
6
-  <title>Privacy Policy — App for Indeed</title>
7
-  <meta name="description" content="Privacy Policy for App for Indeed, a native Mac job-search companion app.">
8
-  <link rel="stylesheet" href="styles.css">
9
-</head>
10
-<body>
11
-  <header class="site-header">
12
-    <div class="site-header__inner">
13
-      <a class="brand" href="index.html">
14
-        <span class="brand__mark" aria-hidden="true">✦</span>
15
-        App for Indeed
16
-      </a>
17
-      <nav class="site-nav" aria-label="Primary">
18
-        <a href="index.html">Home</a>
19
-        <a href="privacy.html" aria-current="page">Privacy Policy</a>
20
-        <a href="terms.html">Terms of Service</a>
21
-      </nav>
22
-    </div>
23
-  </header>
24
-
25
-  <main class="legal">
26
-    <h1>Privacy Policy</h1>
27
-    <p class="meta">Effective date: May 15, 2026</p>
28
-
29
-    <p>
30
-      This Privacy Policy describes how <strong>App for Indeed</strong> (“the App,” “we,” “us”) handles information when you use our native macOS application. By using the App, you agree to the practices described here.
31
-    </p>
32
-
33
-    <h2>Who we are</h2>
34
-    <p>
35
-      App for Indeed is published by the developer identified on the Mac App Store product page. The App is an independent tool and is not affiliated with Indeed.com or Indeed, Inc.
36
-    </p>
37
-
38
-    <h2>Information stored on your Mac</h2>
39
-    <p>Most data you enter stays on your device, including:</p>
40
-    <ul>
41
-      <li>Career profiles (work history, skills, contact details, and related fields you provide)</li>
42
-      <li>Saved job listings and chat session content shown in the App</li>
43
-      <li>App preferences and usage counters used for features such as rating prompts</li>
44
-    </ul>
45
-    <p>
46
-      This information is stored locally (for example, in app sandbox storage or standard macOS user defaults) and is not transmitted to our servers because the App does not operate a separate user account backend.
47
-    </p>
48
-
49
-    <h2>Information sent to third parties</h2>
50
-    <p>When you use certain features, data may be sent to services outside the App:</p>
51
-    <ul>
52
-      <li>
53
-        <strong>OpenAI</strong> — Job-search assistance sends your search prompts and related context to OpenAI’s API so the model can return listings and conversational replies. OpenAI’s use of that data is governed by
54
-        <a href="https://openai.com/policies/privacy-policy" rel="noopener noreferrer">OpenAI’s Privacy Policy</a>.
55
-      </li>
56
-      <li>
57
-        <strong>Indeed.com</strong> — When you browse or apply to jobs, the embedded web view loads pages hosted by Indeed. Indeed’s collection and use of data is governed by
58
-        <a href="https://www.indeed.com/legal" rel="noopener noreferrer">Indeed’s policies</a>.
59
-      </li>
60
-      <li>
61
-        <strong>Apple</strong> — Subscriptions, restores, and receipts are processed by Apple through StoreKit. Payment and account details are handled under
62
-        <a href="https://www.apple.com/legal/privacy/" rel="noopener noreferrer">Apple’s Privacy Policy</a>.
63
-      </li>
64
-    </ul>
65
-
66
-    <h2>What we do not collect</h2>
67
-    <p>
68
-      We do not require you to create an App-specific account. We do not intentionally collect government ID numbers, payment card numbers, or health information through the App. Apple processes subscription payments; we do not receive your full payment credentials.
69
-    </p>
70
-
71
-    <h2>How we use information</h2>
72
-    <p>We use information only to:</p>
73
-    <ul>
74
-      <li>Provide job search, saved jobs, profiles, CV generation, and browsing features</li>
75
-      <li>Validate subscriptions and unlock Pro features</li>
76
-      <li>Improve reliability and fix defects</li>
77
-    </ul>
78
-    <p>We do not sell your personal information.</p>
79
-
80
-    <h2>Retention</h2>
81
-    <p>
82
-      Data stored on your Mac remains until you delete it within the App, remove the App, or erase the App’s data from your system. Information processed by OpenAI, Indeed, or Apple is retained according to their respective policies.
83
-    </p>
84
-
85
-    <h2>Security</h2>
86
-    <p>
87
-      We design the App to keep sensitive material on your device where possible. No method of transmission or storage is completely secure; you use the App at your own risk and should protect your Mac with a strong login password and current system updates.
88
-    </p>
89
-
90
-    <h2>Children</h2>
91
-    <p>
92
-      The App is not directed to children under 13 (or the minimum age required in your jurisdiction). We do not knowingly collect personal information from children.
93
-    </p>
94
-
95
-    <h2>Your choices</h2>
96
-    <ul>
97
-      <li>Delete profiles, saved jobs, or chat history inside the App</li>
98
-      <li>Uninstall the App to remove locally stored data</li>
99
-      <li>Manage subscriptions in System Settings or at <a href="https://apps.apple.com/account/subscriptions">Apple’s subscription page</a></li>
100
-    </ul>
101
-
102
-    <h2>International users</h2>
103
-    <p>
104
-      If you use the App outside your home country, your information may be processed in the United States or other countries where our service providers operate.
105
-    </p>
106
-
107
-    <h2>Changes</h2>
108
-    <p>
109
-      We may update this Privacy Policy from time to time. The “Effective date” at the top will change when we do. Continued use of the App after an update means you accept the revised policy.
110
-    </p>
111
-
112
-    <h2>Contact</h2>
113
-    <p>
114
-      For privacy questions, contact the developer using the support link on the App’s Mac App Store listing or the in-app Support option when available.
115
-    </p>
116
-  </main>
117
-
118
-  <footer class="page-footer">
119
-    <div class="page-footer__inner">
120
-      <p>© 2026 App for Indeed. All rights reserved.</p>
121
-      <nav aria-label="Footer">
122
-        <a href="privacy.html">Privacy</a>
123
-        <a href="terms.html">Terms</a>
124
-        <a href="index.html">Home</a>
125
-      </nav>
126
-    </div>
127
-  </footer>
128
-</body>
129
-</html>

+ 0 - 274
docs/styles.css

@@ -1,274 +0,0 @@
1
-:root {
2
-  --brand: #2557a7;
3
-  --brand-dark: #1a4389;
4
-  --heading: #0052cc;
5
-  --text: #2d2d2d;
6
-  --muted: #767676;
7
-  --border: #d4d2d0;
8
-  --bg: #ffffff;
9
-  --bg-subtle: #f7f7f7;
10
-  --well: #eff6ff;
11
-  --radius: 12px;
12
-  --max: 720px;
13
-  --wide: 960px;
14
-  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
15
-  line-height: 1.6;
16
-  color: var(--text);
17
-}
18
-
19
-*,
20
-*::before,
21
-*::after {
22
-  box-sizing: border-box;
23
-}
24
-
25
-body {
26
-  margin: 0;
27
-  background: var(--bg);
28
-}
29
-
30
-a {
31
-  color: var(--brand);
32
-  text-decoration: none;
33
-}
34
-
35
-a:hover {
36
-  text-decoration: underline;
37
-}
38
-
39
-.site-header {
40
-  border-bottom: 1px solid var(--border);
41
-  background: var(--bg);
42
-}
43
-
44
-.site-header__inner,
45
-.page-footer__inner,
46
-.hero__inner,
47
-.features__inner,
48
-.legal {
49
-  width: min(100% - 2rem, var(--wide));
50
-  margin-inline: auto;
51
-}
52
-
53
-.site-header__inner {
54
-  display: flex;
55
-  align-items: center;
56
-  justify-content: space-between;
57
-  gap: 1rem;
58
-  padding: 1rem 0;
59
-}
60
-
61
-.brand {
62
-  display: flex;
63
-  align-items: center;
64
-  gap: 0.65rem;
65
-  font-weight: 700;
66
-  font-size: 1.05rem;
67
-  color: var(--heading);
68
-  text-decoration: none;
69
-}
70
-
71
-.brand:hover {
72
-  text-decoration: none;
73
-}
74
-
75
-.brand__mark {
76
-  width: 2rem;
77
-  height: 2rem;
78
-  border-radius: 8px;
79
-  background: linear-gradient(145deg, var(--well), #dbeafe);
80
-  border: 1px solid #bfdbfe;
81
-  display: grid;
82
-  place-items: center;
83
-  color: var(--brand);
84
-  font-size: 0.95rem;
85
-}
86
-
87
-.site-nav {
88
-  display: flex;
89
-  flex-wrap: wrap;
90
-  gap: 1rem 1.25rem;
91
-  font-size: 0.95rem;
92
-}
93
-
94
-.site-nav a {
95
-  color: var(--muted);
96
-  font-weight: 500;
97
-}
98
-
99
-.site-nav a[aria-current="page"],
100
-.site-nav a:hover {
101
-  color: var(--brand);
102
-}
103
-
104
-.hero {
105
-  background: linear-gradient(180deg, var(--well) 0%, var(--bg) 70%);
106
-  border-bottom: 1px solid var(--border);
107
-}
108
-
109
-.hero__inner {
110
-  padding: 3.5rem 0 3rem;
111
-  text-align: center;
112
-}
113
-
114
-.hero h1 {
115
-  margin: 0 0 0.75rem;
116
-  font-size: clamp(2rem, 4vw, 2.75rem);
117
-  line-height: 1.15;
118
-  color: var(--heading);
119
-  letter-spacing: -0.02em;
120
-}
121
-
122
-.hero p.lead {
123
-  margin: 0 auto 1.75rem;
124
-  max-width: 38rem;
125
-  font-size: 1.125rem;
126
-  color: var(--muted);
127
-}
128
-
129
-.cta-row {
130
-  display: flex;
131
-  flex-wrap: wrap;
132
-  gap: 0.75rem;
133
-  justify-content: center;
134
-}
135
-
136
-.button {
137
-  display: inline-flex;
138
-  align-items: center;
139
-  justify-content: center;
140
-  padding: 0.7rem 1.25rem;
141
-  border-radius: 999px;
142
-  font-weight: 600;
143
-  font-size: 0.95rem;
144
-  border: 1px solid transparent;
145
-  text-decoration: none;
146
-}
147
-
148
-.button:hover {
149
-  text-decoration: none;
150
-}
151
-
152
-.button--primary {
153
-  background: var(--brand);
154
-  color: #fff;
155
-}
156
-
157
-.button--primary:hover {
158
-  background: var(--brand-dark);
159
-  color: #fff;
160
-}
161
-
162
-.button--secondary {
163
-  background: #fff;
164
-  color: var(--brand);
165
-  border-color: var(--border);
166
-}
167
-
168
-.features {
169
-  padding: 3rem 0 4rem;
170
-}
171
-
172
-.features h2 {
173
-  text-align: center;
174
-  margin: 0 0 2rem;
175
-  font-size: 1.5rem;
176
-  color: var(--text);
177
-}
178
-
179
-.feature-grid {
180
-  display: grid;
181
-  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
182
-  gap: 1rem;
183
-}
184
-
185
-.feature-card {
186
-  padding: 1.25rem;
187
-  border: 1px solid var(--border);
188
-  border-radius: var(--radius);
189
-  background: var(--bg);
190
-}
191
-
192
-.feature-card h3 {
193
-  margin: 0 0 0.35rem;
194
-  font-size: 1.05rem;
195
-  color: var(--heading);
196
-}
197
-
198
-.feature-card p {
199
-  margin: 0;
200
-  font-size: 0.95rem;
201
-  color: var(--muted);
202
-}
203
-
204
-.disclaimer {
205
-  margin: 0 auto 3rem;
206
-  width: min(100% - 2rem, var(--wide));
207
-  padding: 1rem 1.25rem;
208
-  border-radius: var(--radius);
209
-  background: var(--bg-subtle);
210
-  border: 1px solid var(--border);
211
-  font-size: 0.9rem;
212
-  color: var(--muted);
213
-}
214
-
215
-.legal {
216
-  max-width: var(--max);
217
-  padding: 2.5rem 0 4rem;
218
-}
219
-
220
-.legal h1 {
221
-  margin: 0 0 0.35rem;
222
-  font-size: 2rem;
223
-  color: var(--heading);
224
-}
225
-
226
-.legal .meta {
227
-  margin: 0 0 2rem;
228
-  color: var(--muted);
229
-  font-size: 0.9rem;
230
-}
231
-
232
-.legal h2 {
233
-  margin: 2rem 0 0.5rem;
234
-  font-size: 1.2rem;
235
-  color: var(--text);
236
-}
237
-
238
-.legal p,
239
-.legal li {
240
-  color: var(--text);
241
-}
242
-
243
-.legal ul {
244
-  padding-left: 1.25rem;
245
-}
246
-
247
-.page-footer {
248
-  border-top: 1px solid var(--border);
249
-  background: var(--bg-subtle);
250
-  padding: 1.5rem 0 2rem;
251
-  font-size: 0.9rem;
252
-  color: var(--muted);
253
-}
254
-
255
-.page-footer__inner {
256
-  display: flex;
257
-  flex-wrap: wrap;
258
-  gap: 0.75rem 1.5rem;
259
-  justify-content: space-between;
260
-  align-items: center;
261
-}
262
-
263
-.page-footer nav {
264
-  display: flex;
265
-  flex-wrap: wrap;
266
-  gap: 1rem;
267
-}
268
-
269
-@media (max-width: 600px) {
270
-  .site-header__inner {
271
-    flex-direction: column;
272
-    align-items: flex-start;
273
-  }
274
-}

+ 0 - 128
docs/terms.html

@@ -1,128 +0,0 @@
1
-<!DOCTYPE html>
2
-<html lang="en">
3
-<head>
4
-  <meta charset="utf-8">
5
-  <meta name="viewport" content="width=device-width, initial-scale=1">
6
-  <title>Terms of Service — App for Indeed</title>
7
-  <meta name="description" content="Terms of Service for App for Indeed, a native Mac job-search companion app.">
8
-  <link rel="stylesheet" href="styles.css">
9
-</head>
10
-<body>
11
-  <header class="site-header">
12
-    <div class="site-header__inner">
13
-      <a class="brand" href="index.html">
14
-        <span class="brand__mark" aria-hidden="true">✦</span>
15
-        App for Indeed
16
-      </a>
17
-      <nav class="site-nav" aria-label="Primary">
18
-        <a href="index.html">Home</a>
19
-        <a href="privacy.html">Privacy Policy</a>
20
-        <a href="terms.html" aria-current="page">Terms of Service</a>
21
-      </nav>
22
-    </div>
23
-  </header>
24
-
25
-  <main class="legal">
26
-    <h1>Terms of Service</h1>
27
-    <p class="meta">Effective date: May 15, 2026</p>
28
-
29
-    <p>
30
-      These Terms of Service (“Terms”) govern your use of <strong>App for Indeed</strong> (“the App”). By downloading, installing, or using the App, you agree to these Terms. If you do not agree, do not use the App.
31
-    </p>
32
-
33
-    <h2>1. The service</h2>
34
-    <p>
35
-      App for Indeed is a native macOS application that helps you search for jobs, save listings, manage career profiles, generate CVs, and browse Indeed-hosted web content. Features may change over time. Some capabilities require an active <strong>App for Indeed Pro</strong> subscription.
36
-    </p>
37
-
38
-    <h2>2. No affiliation with Indeed</h2>
39
-    <p>
40
-      The App is developed by an independent publisher. It is <strong>not</strong> affiliated with, endorsed by, or sponsored by Indeed.com or Indeed, Inc. “Indeed” is a trademark of Indeed, Inc. Your use of Indeed’s website remains subject to Indeed’s own terms and policies.
41
-    </p>
42
-
43
-    <h2>3. Eligibility</h2>
44
-    <p>
45
-      You must be able to form a binding contract in your jurisdiction and meet any minimum age required by Apple or local law. You are responsible for compliance with laws that apply to your job search activities.
46
-    </p>
47
-
48
-    <h2>4. Subscriptions and billing</h2>
49
-    <p>
50
-      Pro features are offered as auto-renewing subscriptions (weekly, monthly, and/or yearly) through the Mac App Store. Payment, renewal, cancellation, refunds, and free trials are handled by Apple under
51
-      <a href="https://www.apple.com/legal/internet-services/itunes/" rel="noopener noreferrer">Apple’s Media Services Terms</a>.
52
-      You can manage or cancel subscriptions in System Settings or via
53
-      <a href="https://apps.apple.com/account/subscriptions">Apple’s subscription management page</a>.
54
-    </p>
55
-
56
-    <h2>5. AI-assisted job search</h2>
57
-    <p>
58
-      The App may use third-party AI services to interpret your queries and suggest job listings. AI output can be incomplete, outdated, or inaccurate. You are solely responsible for verifying listings, employers, compensation, and application requirements before acting on any suggestion.
59
-    </p>
60
-
61
-    <h2>6. Your content and conduct</h2>
62
-    <p>You agree not to:</p>
63
-    <ul>
64
-      <li>Use the App for unlawful, fraudulent, or harassing purposes</li>
65
-      <li>Attempt to reverse engineer, scrape, or overload Indeed or third-party services beyond normal personal use</li>
66
-      <li>Upload or generate content that infringes others’ rights or contains malware</li>
67
-      <li>Misrepresent your identity to employers or service providers</li>
68
-    </ul>
69
-    <p>You retain ownership of information you enter. You grant us only the rights needed to operate the App on your device and to transmit data to integrated services (such as AI or web providers) when you invoke those features.</p>
70
-
71
-    <h2>7. Third-party services</h2>
72
-    <p>
73
-      The App relies on services we do not control (including OpenAI, Indeed, and Apple). We are not responsible for their availability, content, or policies. Your use of those services may be subject to separate terms.
74
-    </p>
75
-
76
-    <h2>8. Intellectual property</h2>
77
-    <p>
78
-      The App, its design, and original materials are owned by the developer and protected by applicable intellectual-property laws. These Terms do not grant you any rights to our trademarks except as needed to refer to the App.
79
-    </p>
80
-
81
-    <h2>9. Disclaimers</h2>
82
-    <p>
83
-      THE APP IS PROVIDED “AS IS” AND “AS AVAILABLE” WITHOUT WARRANTIES OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. WE DO NOT WARRANT THAT THE APP WILL BE UNINTERRUPTED, ERROR-FREE, OR THAT JOB LISTINGS OR AI RESPONSES WILL BE ACCURATE OR CURRENT.
84
-    </p>
85
-
86
-    <h2>10. Limitation of liability</h2>
87
-    <p>
88
-      TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE DEVELOPER WILL NOT BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES, OR FOR LOST PROFITS, DATA, OR OPPORTUNITIES, ARISING FROM YOUR USE OF THE APP. OUR TOTAL LIABILITY FOR ANY CLAIM RELATING TO THE APP WILL NOT EXCEED THE GREATER OF (A) THE AMOUNT YOU PAID FOR THE APP OR SUBSCRIPTIONS IN THE TWELVE MONTHS BEFORE THE CLAIM OR (B) USD $50.
89
-    </p>
90
-
91
-    <h2>11. Indemnity</h2>
92
-    <p>
93
-      You agree to defend and indemnify the developer against claims arising from your misuse of the App, your content, or your violation of these Terms or applicable law.
94
-    </p>
95
-
96
-    <h2>12. Termination</h2>
97
-    <p>
98
-      You may stop using the App at any time by uninstalling it. We may suspend or discontinue the App where required by law or platform policy. Sections that by their nature should survive termination (including disclaimers, limitations of liability, and indemnity) will survive.
99
-    </p>
100
-
101
-    <h2>13. Changes</h2>
102
-    <p>
103
-      We may update these Terms. The effective date above will change when we do. Material changes will be posted on this page. Continued use after changes constitutes acceptance.
104
-    </p>
105
-
106
-    <h2>14. Governing law</h2>
107
-    <p>
108
-      These Terms are governed by the laws of the jurisdiction where the developer is established, without regard to conflict-of-law rules, except where mandatory consumer protections in your country require otherwise.
109
-    </p>
110
-
111
-    <h2>15. Contact</h2>
112
-    <p>
113
-      For questions about these Terms, contact the developer using the support link on the App’s Mac App Store listing or the in-app Support option when available.
114
-    </p>
115
-  </main>
116
-
117
-  <footer class="page-footer">
118
-    <div class="page-footer__inner">
119
-      <p>© 2026 App for Indeed. All rights reserved.</p>
120
-      <nav aria-label="Footer">
121
-        <a href="privacy.html">Privacy</a>
122
-        <a href="terms.html">Terms</a>
123
-        <a href="index.html">Home</a>
124
-      </nav>
125
-    </div>
126
-  </footer>
127
-</body>
128
-</html>