content-grade 1.0.16 → 1.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,189 @@
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.0" />
6
+ <title>Privacy Policy — ContentGrade</title>
7
+ <meta name="description" content="Privacy Policy for ContentGrade — the local AI content grader suite." />
8
+ <link rel="canonical" href="https://content-grade.github.io/Content-Grade/privacy.html" />
9
+ <style>
10
+ :root {
11
+ --bg: #0a0a0f;
12
+ --bg2: #0f0f1a;
13
+ --bg3: #141424;
14
+ --border: rgba(255,255,255,0.08);
15
+ --text: #e0e0e0;
16
+ --muted: #888;
17
+ --accent: #7c4dff;
18
+ --accent-light: #9e7aff;
19
+ }
20
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
21
+ html { scroll-behavior: smooth; }
22
+ body {
23
+ background: var(--bg);
24
+ color: var(--text);
25
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Inter', sans-serif;
26
+ font-size: 16px;
27
+ line-height: 1.7;
28
+ }
29
+ a { color: var(--accent-light); text-decoration: none; }
30
+ a:hover { text-decoration: underline; }
31
+ nav {
32
+ position: sticky;
33
+ top: 0;
34
+ background: rgba(10,10,15,0.92);
35
+ border-bottom: 1px solid var(--border);
36
+ padding: 14px 24px;
37
+ display: flex;
38
+ align-items: center;
39
+ gap: 16px;
40
+ backdrop-filter: blur(8px);
41
+ z-index: 100;
42
+ }
43
+ .nav-logo {
44
+ font-size: 15px;
45
+ font-weight: 700;
46
+ color: var(--text);
47
+ display: flex;
48
+ align-items: center;
49
+ gap: 8px;
50
+ text-decoration: none;
51
+ }
52
+ .nav-logo:hover { text-decoration: none; color: var(--accent-light); }
53
+ .logo-icon { font-size: 18px; }
54
+ .nav-back { font-size: 13px; color: var(--muted); margin-left: auto; }
55
+ .nav-back:hover { color: var(--text); }
56
+ main {
57
+ max-width: 720px;
58
+ margin: 0 auto;
59
+ padding: 60px 24px 80px;
60
+ }
61
+ .page-header { margin-bottom: 48px; }
62
+ .page-header h1 {
63
+ font-size: 2rem;
64
+ font-weight: 700;
65
+ margin-bottom: 8px;
66
+ }
67
+ .page-header p { color: var(--muted); font-size: 14px; }
68
+ h2 {
69
+ font-size: 1.1rem;
70
+ font-weight: 600;
71
+ color: var(--text);
72
+ margin: 36px 0 12px;
73
+ padding-bottom: 8px;
74
+ border-bottom: 1px solid var(--border);
75
+ }
76
+ p { margin-bottom: 16px; }
77
+ ul { margin: 12px 0 16px 20px; }
78
+ li { margin-bottom: 6px; }
79
+ .highlight {
80
+ background: var(--bg3);
81
+ border: 1px solid var(--border);
82
+ border-left: 3px solid var(--accent);
83
+ border-radius: 6px;
84
+ padding: 16px 20px;
85
+ margin: 24px 0;
86
+ font-size: 15px;
87
+ }
88
+ footer {
89
+ border-top: 1px solid var(--border);
90
+ padding: 32px 24px;
91
+ text-align: center;
92
+ color: var(--muted);
93
+ font-size: 13px;
94
+ }
95
+ footer a { color: var(--muted); }
96
+ footer a:hover { color: var(--accent-light); text-decoration: none; }
97
+ .footer-links { display: flex; justify-content: center; gap: 24px; margin-top: 12px; }
98
+ </style>
99
+ </head>
100
+ <body>
101
+
102
+ <nav>
103
+ <a class="nav-logo" href="./landing.html">
104
+ <span class="logo-icon">✦</span>
105
+ ContentGrade
106
+ </a>
107
+ <a class="nav-back" href="./landing.html">← Back to home</a>
108
+ </nav>
109
+
110
+ <main>
111
+ <div class="page-header">
112
+ <h1>Privacy Policy</h1>
113
+ <p>Last updated: March 2026</p>
114
+ </div>
115
+
116
+ <div class="highlight">
117
+ <strong>Short version:</strong> ContentGrade runs entirely on your local machine. Your content never leaves your device. Optional, opt-in telemetry collects only aggregate usage statistics — no personal data, no content, no identifiers.
118
+ </div>
119
+
120
+ <h2>1. What ContentGrade Is</h2>
121
+ <p>ContentGrade is an open-source CLI tool for AI-powered content quality analysis. It runs locally on your computer via the Claude CLI. All analysis is performed on-device — ContentGrade has no servers, no cloud backend, and no data pipeline.</p>
122
+
123
+ <h2>2. Data We Collect</h2>
124
+ <p>ContentGrade collects <strong>no data by default</strong>. There is an optional, opt-in telemetry system that you must explicitly enable by running:</p>
125
+ <p style="background:var(--bg3);padding:10px 14px;border-radius:6px;font-family:monospace;font-size:14px;">content-grade telemetry on</p>
126
+ <p>If you enable telemetry, the following <strong>anonymous, aggregate</strong> statistics may be sent:</p>
127
+ <ul>
128
+ <li>Which command was used (e.g., "grade", "headline", "batch")</li>
129
+ <li>Whether the command succeeded or failed (no error messages, no content)</li>
130
+ <li>Approximate duration of the command</li>
131
+ <li>Score range buckets (e.g., "60–70") — not exact scores, never your content</li>
132
+ <li>A random session ID that resets every 24 hours (not linked to you)</li>
133
+ </ul>
134
+ <p>We <strong>never</strong> collect: your content, your API keys, your file paths, your IP address, or any personally identifiable information.</p>
135
+ <p>You can disable telemetry at any time: <code>content-grade telemetry off</code></p>
136
+
137
+ <h2>3. Landing Page Analytics</h2>
138
+ <p>The ContentGrade website uses <a href="https://www.goatcounter.com" target="_blank" rel="noopener">GoatCounter</a> for privacy-friendly page view analytics. GoatCounter:</p>
139
+ <ul>
140
+ <li>Does not use cookies</li>
141
+ <li>Does not collect personal data or IP addresses</li>
142
+ <li>Does not track users across sites</li>
143
+ <li>Is open source and GDPR-compliant by design</li>
144
+ </ul>
145
+
146
+ <h2>4. Third-Party Services</h2>
147
+ <p>ContentGrade depends on the following third-party services, each with their own privacy practices:</p>
148
+ <ul>
149
+ <li><strong>Anthropic Claude CLI</strong> — ContentGrade uses Claude CLI to perform content analysis. Your content is sent to Anthropic's API as part of normal Claude CLI operation. Review <a href="https://www.anthropic.com/privacy" target="_blank" rel="noopener">Anthropic's Privacy Policy</a> for details on how they handle data.</li>
150
+ <li><strong>npm Registry</strong> — Used only for installation. No ongoing data collection.</li>
151
+ </ul>
152
+ <p>ContentGrade does not sell or share your data with any third parties.</p>
153
+
154
+ <h2>5. Your Rights (GDPR)</h2>
155
+ <p>If you are in the European Union or UK, you have the following rights under GDPR:</p>
156
+ <ul>
157
+ <li><strong>Right of access</strong> — You can request a copy of any data we hold about you.</li>
158
+ <li><strong>Right to erasure</strong> — You can request deletion of any data associated with you.</li>
159
+ <li><strong>Right to object</strong> — You can opt out of telemetry at any time with <code>content-grade telemetry off</code>.</li>
160
+ </ul>
161
+ <p>Because ContentGrade does not collect personal data by default, GDPR obligations are minimal. The opt-in telemetry stores no personal identifiers. If you have a concern, contact us and we will respond within 30 days.</p>
162
+
163
+ <h2>6. Data Retention</h2>
164
+ <p>Telemetry data (if enabled) is aggregate-only and retained for up to 12 months for product improvement. No content or personal data is ever stored.</p>
165
+
166
+ <h2>7. Children's Privacy</h2>
167
+ <p>ContentGrade is a developer tool not directed at children under 13. We do not knowingly collect information from children.</p>
168
+
169
+ <h2>8. Changes to This Policy</h2>
170
+ <p>We may update this Privacy Policy from time to time. The "Last updated" date at the top reflects the most recent revision. Continued use of ContentGrade after changes constitutes acceptance of the updated policy.</p>
171
+
172
+ <h2>9. Contact</h2>
173
+ <p>Questions or requests about this Privacy Policy:</p>
174
+ <p><a href="mailto:bilko@bglabs.app">bilko@bglabs.app</a></p>
175
+ <p>ContentGrade is open source: <a href="https://github.com/Content-Grade/Content-Grade" target="_blank" rel="noopener">github.com/Content-Grade/Content-Grade</a></p>
176
+ </main>
177
+
178
+ <footer>
179
+ <span>&copy; 2026 ContentGrade. MIT Licensed.</span>
180
+ <div class="footer-links">
181
+ <a href="./landing.html">Home</a>
182
+ <a href="./privacy.html">Privacy Policy</a>
183
+ <a href="./terms.html">Terms of Service</a>
184
+ <a href="mailto:bilko@bglabs.app">Contact</a>
185
+ </div>
186
+ </footer>
187
+
188
+ </body>
189
+ </html>
@@ -0,0 +1,185 @@
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.0" />
6
+ <title>Terms of Service — ContentGrade</title>
7
+ <meta name="description" content="Terms of Service for ContentGrade — the local AI content grader suite." />
8
+ <link rel="canonical" href="https://content-grade.github.io/Content-Grade/terms.html" />
9
+ <style>
10
+ :root {
11
+ --bg: #0a0a0f;
12
+ --bg2: #0f0f1a;
13
+ --bg3: #141424;
14
+ --border: rgba(255,255,255,0.08);
15
+ --text: #e0e0e0;
16
+ --muted: #888;
17
+ --accent: #7c4dff;
18
+ --accent-light: #9e7aff;
19
+ }
20
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
21
+ html { scroll-behavior: smooth; }
22
+ body {
23
+ background: var(--bg);
24
+ color: var(--text);
25
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Inter', sans-serif;
26
+ font-size: 16px;
27
+ line-height: 1.7;
28
+ }
29
+ a { color: var(--accent-light); text-decoration: none; }
30
+ a:hover { text-decoration: underline; }
31
+ nav {
32
+ position: sticky;
33
+ top: 0;
34
+ background: rgba(10,10,15,0.92);
35
+ border-bottom: 1px solid var(--border);
36
+ padding: 14px 24px;
37
+ display: flex;
38
+ align-items: center;
39
+ gap: 16px;
40
+ backdrop-filter: blur(8px);
41
+ z-index: 100;
42
+ }
43
+ .nav-logo {
44
+ font-size: 15px;
45
+ font-weight: 700;
46
+ color: var(--text);
47
+ display: flex;
48
+ align-items: center;
49
+ gap: 8px;
50
+ text-decoration: none;
51
+ }
52
+ .nav-logo:hover { text-decoration: none; color: var(--accent-light); }
53
+ .logo-icon { font-size: 18px; }
54
+ .nav-back { font-size: 13px; color: var(--muted); margin-left: auto; }
55
+ .nav-back:hover { color: var(--text); }
56
+ main {
57
+ max-width: 720px;
58
+ margin: 0 auto;
59
+ padding: 60px 24px 80px;
60
+ }
61
+ .page-header { margin-bottom: 48px; }
62
+ .page-header h1 {
63
+ font-size: 2rem;
64
+ font-weight: 700;
65
+ margin-bottom: 8px;
66
+ }
67
+ .page-header p { color: var(--muted); font-size: 14px; }
68
+ h2 {
69
+ font-size: 1.1rem;
70
+ font-weight: 600;
71
+ color: var(--text);
72
+ margin: 36px 0 12px;
73
+ padding-bottom: 8px;
74
+ border-bottom: 1px solid var(--border);
75
+ }
76
+ p { margin-bottom: 16px; }
77
+ ul { margin: 12px 0 16px 20px; }
78
+ li { margin-bottom: 6px; }
79
+ .highlight {
80
+ background: var(--bg3);
81
+ border: 1px solid var(--border);
82
+ border-left: 3px solid var(--accent);
83
+ border-radius: 6px;
84
+ padding: 16px 20px;
85
+ margin: 24px 0;
86
+ font-size: 15px;
87
+ }
88
+ footer {
89
+ border-top: 1px solid var(--border);
90
+ padding: 32px 24px;
91
+ text-align: center;
92
+ color: var(--muted);
93
+ font-size: 13px;
94
+ }
95
+ footer a { color: var(--muted); }
96
+ footer a:hover { color: var(--accent-light); text-decoration: none; }
97
+ .footer-links { display: flex; justify-content: center; gap: 24px; margin-top: 12px; }
98
+ </style>
99
+ </head>
100
+ <body>
101
+
102
+ <nav>
103
+ <a class="nav-logo" href="./landing.html">
104
+ <span class="logo-icon">✦</span>
105
+ ContentGrade
106
+ </a>
107
+ <a class="nav-back" href="./landing.html">← Back to home</a>
108
+ </nav>
109
+
110
+ <main>
111
+ <div class="page-header">
112
+ <h1>Terms of Service</h1>
113
+ <p>Last updated: March 2026</p>
114
+ </div>
115
+
116
+ <div class="highlight">
117
+ <strong>Short version:</strong> ContentGrade is open-source software (MIT license). Use it freely. We provide no warranties. You agree not to use it for spam or anything illegal.
118
+ </div>
119
+
120
+ <h2>1. Acceptance of Terms</h2>
121
+ <p>By installing or using ContentGrade ("the Software"), you agree to these Terms of Service. If you do not agree, do not use the Software.</p>
122
+
123
+ <h2>2. License</h2>
124
+ <p>ContentGrade is released under the <strong>MIT License</strong>. You are free to:</p>
125
+ <ul>
126
+ <li>Use the Software for any purpose, commercial or personal</li>
127
+ <li>Modify, copy, and distribute the Software</li>
128
+ <li>Include the Software in your own projects</li>
129
+ </ul>
130
+ <p>The full license text is included in the <a href="https://github.com/Content-Grade/Content-Grade/blob/main/LICENSE" target="_blank" rel="noopener">GitHub repository</a>.</p>
131
+
132
+ <h2>3. Acceptable Use</h2>
133
+ <p>You agree not to use ContentGrade to:</p>
134
+ <ul>
135
+ <li>Generate or score content intended for spam, phishing, or fraud</li>
136
+ <li>Violate any applicable law or regulation</li>
137
+ <li>Circumvent safety measures in third-party services</li>
138
+ <li>Impersonate others or create misleading content at scale</li>
139
+ </ul>
140
+
141
+ <h2>4. Third-Party Services</h2>
142
+ <p>ContentGrade uses the Anthropic Claude CLI for content analysis. Your use of Claude CLI is subject to <a href="https://www.anthropic.com/legal/consumer-terms" target="_blank" rel="noopener">Anthropic's Terms of Service</a>. ContentGrade is not affiliated with or endorsed by Anthropic.</p>
143
+
144
+ <h2>5. No Warranties</h2>
145
+ <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ContentGrade's scores and analysis are AI-generated suggestions — not professional advice. Do not rely on them as the sole basis for business decisions.</p>
146
+
147
+ <h2>6. Limitation of Liability</h2>
148
+ <p>IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY — WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE — ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF THE SOFTWARE.</p>
149
+
150
+ <h2>7. Pro Tier</h2>
151
+ <p>ContentGrade Pro is a paid tier providing additional features. Payment is processed by Stripe. Refunds are handled on a case-by-case basis — contact <a href="mailto:bilko@bglabs.app">bilko@bglabs.app</a> within 14 days of purchase if the Software does not function as described.</p>
152
+
153
+ <h2>8. Usage Limits and Abuse</h2>
154
+ <p>Free tier accounts are limited to 5 analyses per day. Paid plans have usage limits as described at the time of purchase. We reserve the right to suspend or terminate any account that exceeds its plan limits, engages in automated abuse, or violates these Terms, with or without notice.</p>
155
+
156
+ <h2>9. Termination</h2>
157
+ <p>We may terminate or suspend your access to the Service immediately, without prior notice, for conduct that we determine violates these Terms or is harmful to the Service, other users, or third parties.</p>
158
+
159
+ <h2>10. Indemnification</h2>
160
+ <p>You agree to indemnify, defend, and hold harmless ContentGrade and its operators from any claims, damages, losses, liabilities, costs, or expenses (including reasonable attorneys' fees) arising from your use of the Service, your violation of these Terms, or your violation of any third-party rights.</p>
161
+
162
+ <h2>11. Changes to Terms</h2>
163
+ <p>We may update these Terms from time to time. The "Last updated" date at the top reflects the most recent revision. Continued use after changes constitutes acceptance.</p>
164
+
165
+ <h2>12. Governing Law</h2>
166
+ <p>These Terms shall be governed by and construed in accordance with the laws of the State of Delaware, United States, without regard to conflict of law principles. Any legal action shall be brought exclusively in the courts of Delaware.</p>
167
+
168
+ <h2>13. Contact</h2>
169
+ <p>Questions about these Terms:</p>
170
+ <p><a href="mailto:bilko@bglabs.app">bilko@bglabs.app</a></p>
171
+ <p>ContentGrade is open source: <a href="https://github.com/Content-Grade/Content-Grade" target="_blank" rel="noopener">github.com/Content-Grade/Content-Grade</a></p>
172
+ </main>
173
+
174
+ <footer>
175
+ <span>&copy; 2026 ContentGrade. MIT Licensed.</span>
176
+ <div class="footer-links">
177
+ <a href="./landing.html">Home</a>
178
+ <a href="./privacy.html">Privacy Policy</a>
179
+ <a href="./terms.html">Terms of Service</a>
180
+ <a href="mailto:bilko@bglabs.app">Contact</a>
181
+ </div>
182
+ </footer>
183
+
184
+ </body>
185
+ </html>
@@ -37,16 +37,27 @@ app.get('/api/health', async () => ({
37
37
  }));
38
38
  // In production, serve the Vite build
39
39
  if (isProd) {
40
- const distPath = resolve(__dirname, '../dist');
40
+ const distPath = resolve(__dirname, '../../dist');
41
41
  if (existsSync(distPath)) {
42
42
  await app.register(staticPlugin, {
43
43
  root: distPath,
44
44
  prefix: '/',
45
45
  });
46
- // SPA fallback serve index.html for all non-API routes
46
+ // Root URL landing page (marketing site)
47
+ app.get('/', async (_req, reply) => {
48
+ return reply.sendFile('landing.html');
49
+ });
50
+ // Dashboard lives at /app — serve index.html (Vite SPA)
51
+ app.get('/app', async (_req, reply) => {
52
+ return reply.sendFile('index.html');
53
+ });
54
+ app.get('/app/*', async (_req, reply) => {
55
+ return reply.sendFile('index.html');
56
+ });
57
+ // SPA fallback — unknown routes get 404, not index.html
47
58
  app.setNotFoundHandler(async (req, reply) => {
48
59
  if (!req.url.startsWith('/api')) {
49
- return reply.sendFile('index.html');
60
+ return reply.sendFile('landing.html');
50
61
  }
51
62
  reply.status(404).send({ error: 'Not found' });
52
63
  });
@@ -45,7 +45,7 @@ export function registerLicenseRoutes(app) {
45
45
  if (result.productKey === 'contentgrade_pro' && result.email) {
46
46
  const subActive = hasActiveSubscription(result.email);
47
47
  if (!subActive) {
48
- return { valid: false, message: 'Subscription is no longer active. Please renew at content-grade.github.io/Content-Grade.' };
48
+ return { valid: false, message: 'Subscription is no longer active. Please renew at content-grade.onrender.com.' };
49
49
  }
50
50
  }
51
51
  return { valid: true, email: result.email, productKey: result.productKey };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "content-grade",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
4
4
  "description": "AI-powered content analysis CLI. Score any blog post, landing page, or ad copy in under 30 seconds — runs on Claude CLI, no API key needed.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -43,7 +43,7 @@
43
43
  "dev": "concurrently \"pnpm dev:server\" \"pnpm dev:client\"",
44
44
  "dev:client": "vite",
45
45
  "dev:server": "tsx watch server/index.ts",
46
- "build": "vite build && tsc -p tsconfig.server.json",
46
+ "build": "vite build && tsc -p tsconfig.server.json && cp landing.html terms.html privacy.html dist/ 2>/dev/null || true",
47
47
  "start": "node dist-server/server/index.js",
48
48
  "typecheck": "tsc --noEmit",
49
49
  "test": "vitest run",