seo-intel 1.1.7 → 1.1.8

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.
package/.env.example CHANGED
@@ -2,7 +2,7 @@
2
2
  # Run `node cli.js setup` to configure interactively
3
3
 
4
4
  # ── License (Pro features) ───────────────────────────────────────────────
5
- # Get your key at https://froggo.pro/seo-intel
5
+ # Get your key at https://ukkometa.fi/en/seo-intel/
6
6
  # SEO_INTEL_LICENSE=SI-xxxx-xxxx-xxxx-xxxx
7
7
 
8
8
  # ── Analysis Model (cloud, pick one) ──────────────────────────────────────
package/CHANGELOG.md ADDED
@@ -0,0 +1,42 @@
1
+ # Changelog
2
+
3
+ ## 1.1.8 (2026-03-27)
4
+
5
+ - Rebranded all references from froggo.pro → ukkometa.fi (endpoints, dashboard links, license validation, bot user-agents, skill)
6
+ - Pricing updated: €9.99/mo · €79/yr
7
+ - Contact updated: ukko@ukkometa.fi
8
+ - Added README.md and CHANGELOG.md to npm package and LS zip
9
+
10
+ ## 1.1.7 (2026-03-26)
11
+
12
+ ### New Features
13
+ - **Programmatic Template Intelligence** (`seo-intel templates <project>`) — detect URL pattern groups (e.g. `/token/*`, `/blog/*`), stealth-crawl samples, overlay GSC data, and score each group with keep/noindex/improve verdicts. Pro-gated.
14
+ - **Stale domain auto-pruning** — domains removed from config are now automatically cleaned from the DB (pages, keywords, extractions, schemas, headings, links) on next crawl. No more ghost data from renamed/removed subdomains.
15
+ - **Manual prune** — `seo-intel competitors <project> --prune` to clean stale DB entries on demand.
16
+ - **Full body text storage** — crawler now stores full page body text in DB (up to 200K chars) for richer extraction and analysis. Log output stays compact.
17
+
18
+ ### Improvements
19
+ - **Background crawl/extract** — long-running crawl and extract jobs now survive browser tab close. Terminal shows "backgrounded" instead of "disconnected", and jobs continue server-side.
20
+ - **Dashboard terminal** — stealth flag now visible in terminal command display. Stop button properly closes SSE + server-side process. Status bar syncs with terminal state.
21
+ - **Templates button** added to dashboard terminal panel.
22
+ - **Dashboard refresh** — crawl and analyze now always regenerate the multi-project dashboard, keeping all projects current.
23
+ - **Config remove = DB remove** — `--remove` and `--remove-owned` now auto-prune matching DB data, not just config JSON.
24
+
25
+ ### Fixes
26
+ - SSE disconnect no longer kills crawl/extract processes (detached child process).
27
+ - Terminal command display now shows `--stealth` flag when enabled.
28
+
29
+ ## 1.1.6 (2026-03-24)
30
+
31
+ - Stop button, stealth sync, extraction layout, EADDRINUSE recovery.
32
+
33
+ ## 1.1.5 (2026-03-21)
34
+
35
+ - Update checker, job stop API, background analyze, LAN Ollama hosts, `html` CLI command, wizard UX improvements.
36
+
37
+ ## 1.1.8 (2026-03-27)
38
+
39
+ - Rebranded all references from froggo.pro → ukkometa.fi (endpoints, dashboard links, license validation, bot user-agents, skill)
40
+ - Pricing updated: €9.99/mo · €79/yr
41
+ - Contact updated: ukko@ukkometa.fi
42
+ - Added README.md and CHANGELOG.md to npm package and LS zip
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  SEO Intel — Dual License
2
2
 
3
- Copyright (c) 2024-2026 froggo.pro
3
+ Copyright (c) 2024-2026 Ukkometa (ukkometa.fi)
4
4
 
5
5
  This project uses a dual license structure:
6
6
 
@@ -65,11 +65,10 @@ You MAY:
65
65
  - Share generated reports and dashboards (outputs are yours)
66
66
 
67
67
  License:
68
- Solo — €19.99/month or €199/year — full AI analysis, all commands
69
- Also available at $9.99/month via froggo.pro marketplace
68
+ Solo — €19.99/month or €199.99/year — full AI analysis, all commands
70
69
 
71
- Purchase at: https://ukkometa.fi or https://froggo.pro/seo-intel
70
+ Purchase at: https://ukkometa.fi/en/seo-intel/
72
71
 
73
72
  ================================================================================
74
73
 
75
- For questions: hello@froggo.pro
74
+ For questions: ukko@ukkometa.fi
package/README.md CHANGED
@@ -75,7 +75,7 @@ seo-intel suggest-usecases myproject --scope docs # infer what pages/docs s
75
75
  | `schemas <project>` | Schema.org coverage analysis |
76
76
  | `update` | Check for updates |
77
77
 
78
- ### Solo (€19.99/mo · [ukkometa.fi/seo-intel](https://ukkometa.fi/seo-intel))
78
+ ### Solo (€19.99/mo · [ukkometa.fi/seo-intel](https://ukkometa.fi/en/seo-intel/))
79
79
 
80
80
  | Command | Description |
81
81
  |---------|-------------|
@@ -194,7 +194,7 @@ Upload your GSC data for ranking insights:
194
194
  - 1 project, 500 pages/domain
195
195
  - Crawl, extract, setup, basic reports
196
196
 
197
- ### Pro Tier ($49 one-time)
197
+ ### Solo (€19.99/mo · €199.99/yr)
198
198
  - Unlimited projects and pages
199
199
  - All analysis commands, GSC insights, scheduling
200
200
 
@@ -203,7 +203,7 @@ Upload your GSC data for ranking insights:
203
203
  echo "SEO_INTEL_LICENSE=SI-xxxx-xxxx-xxxx-xxxx" >> .env
204
204
  ```
205
205
 
206
- Get a key at [froggo.pro/seo-intel](https://froggo.pro/seo-intel)
206
+ Get a key at [ukkometa.fi/seo-intel](https://ukkometa.fi/en/seo-intel/)
207
207
 
208
208
  ## Updates
209
209
 
package/cli.js CHANGED
@@ -1269,7 +1269,7 @@ program
1269
1269
  console.log(chalk.gray(' npm registry: ') + chalk.white(info.npmVersion));
1270
1270
  }
1271
1271
  if (info.froggoVersion) {
1272
- console.log(chalk.gray(' froggo.pro: ') + chalk.white(info.froggoVersion));
1272
+ console.log(chalk.gray(' ukkometa.fi: ') + chalk.white(info.froggoVersion));
1273
1273
  }
1274
1274
 
1275
1275
  if (!info.hasUpdate) {
package/crawler/index.js CHANGED
@@ -186,7 +186,7 @@ export async function* crawlDomain(startUrl, opts = {}) {
186
186
  // When hostname contains "docs.", spoof Googlebot UA to reduce WAF friction.
187
187
  const isDocsHostname = base.hostname.toLowerCase().includes('docs.');
188
188
  const GOOGLEBOT_UA = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)';
189
- const defaultUA = 'Mozilla/5.0 (compatible; SEOIntelBot/1.0; +https://froggo.pro/seo-intel/bot)';
189
+ const defaultUA = 'Mozilla/5.0 (compatible; SEOIntelBot/1.0; +https://ukkometa.fi/en/seo-intel/bot)';
190
190
  const effectiveUA = isDocsHostname ? GOOGLEBOT_UA : defaultUA;
191
191
 
192
192
  async function tryLoadLlmsTxt() {
@@ -181,7 +181,7 @@ async function checkHttp(hostname) {
181
181
  signal: controller.signal,
182
182
  redirect: 'follow',
183
183
  headers: {
184
- 'User-Agent': 'Mozilla/5.0 (compatible; SEOIntelBot/1.0; +https://froggo.pro/seo-intel/bot)',
184
+ 'User-Agent': 'Mozilla/5.0 (compatible; SEOIntelBot/1.0; +https://ukkometa.fi/en/seo-intel/bot)',
185
185
  },
186
186
  });
187
187
 
package/lib/gate.js CHANGED
@@ -31,7 +31,7 @@ function printUpgradeMessage(feature) {
31
31
  console.log(`${GOLD}${BOLD} ⭐ Paid Feature: ${feature}${RESET}`);
32
32
  console.log(`${DIM} This feature requires SEO Intel Solo (€19.99/mo).${RESET}`);
33
33
  console.log('');
34
- console.log(`${DIM} Get your license at ${CYAN}https://froggo.pro/seo-intel${RESET}`);
34
+ console.log(`${DIM} Get your license at ${CYAN}https://ukkometa.fi/en/seo-intel/${RESET}`);
35
35
  console.log(`${DIM} Then add your key: ${CYAN}SEO_INTEL_LICENSE=SI-xxxx-xxxx-xxxx-xxxx${RESET} ${DIM}in .env${RESET}`);
36
36
  console.log('');
37
37
  }
@@ -104,7 +104,7 @@ export function getPremiumPlaceholder(section) {
104
104
  <p style="font-size: 0.72rem; color: var(--text-muted); margin-bottom: 12px;">
105
105
  This section requires SEO Intel Solo (€19.99/mo)
106
106
  </p>
107
- <a href="https://froggo.pro/seo-intel" target="_blank"
107
+ <a href="https://ukkometa.fi/en/seo-intel/" target="_blank"
108
108
  style="color: var(--accent-gold); font-size: 0.72rem; text-decoration: underline;">
109
109
  Upgrade to unlock →
110
110
  </a>
@@ -160,7 +160,7 @@ export function capPages(requestedPages) {
160
160
  export function printLicenseStatus() {
161
161
  const license = loadLicense();
162
162
 
163
- const sourceLabel = license.source === 'froggo' ? ' (Froggo)' : license.source === 'lemon-squeezy' ? ' (LS)' : '';
163
+ const sourceLabel = license.source === 'lemon-squeezy' ? ' (LS)' : '';
164
164
 
165
165
  if (license.tier === 'agency') {
166
166
  console.log(`${GOLD}${BOLD} ⭐ SEO Intel Agency${RESET}`);
@@ -181,7 +181,7 @@ export function printLicenseStatus() {
181
181
  if (license.needsActivation) {
182
182
  console.log(`\x1b[33m ⚠ License key found but not yet validated — run any command to activate${RESET}`);
183
183
  }
184
- console.log(`${DIM} Upgrade: ${CYAN}https://froggo.pro/seo-intel${RESET} ${DIM}— Solo €19.99/mo · €199/yr${RESET}`);
184
+ console.log(`${DIM} Upgrade: ${CYAN}https://ukkometa.fi/en/seo-intel/${RESET} ${DIM}— Solo €19.99/mo · €199.99/yr${RESET}`);
185
185
  }
186
186
  console.log('');
187
187
  }
@@ -200,6 +200,6 @@ export function getLicenseInfo() {
200
200
  maxProjects: Number.isFinite(license.maxProjects) ? license.maxProjects : null,
201
201
  maxPages: Number.isFinite(license.maxPagesPerDomain) ? license.maxPagesPerDomain : null,
202
202
  features: license.features === 'all' ? 'all' : [...license.features],
203
- upgradeUrl: 'https://froggo.pro/seo-intel',
203
+ upgradeUrl: 'https://ukkometa.fi/en/seo-intel/',
204
204
  };
205
205
  }
package/lib/license.js CHANGED
@@ -12,7 +12,7 @@
12
12
  * - Beyond stale limit → degrade to free tier + warn
13
13
  *
14
14
  * Free tier: crawl + raw HTML export only. No AI extraction or analysis.
15
- * Solo (€19.99/mo or €199/yr via LS, $9.99/mo via Froggo): Full AI extraction + analysis, all commands.
15
+ * Solo (€19.99/mo or €199.99/yr via LS): Full AI extraction + analysis, all commands.
16
16
  * Agency: Later phase — not sold yet.
17
17
  */
18
18
 
@@ -164,7 +164,7 @@ async function validateWithFroggo(token) {
164
164
  const controller = new AbortController();
165
165
  const timeout = setTimeout(() => controller.abort(), 8000);
166
166
 
167
- const res = await fetch('https://api.froggo.pro/v1/licenses/validate', {
167
+ const res = await fetch('https://ukkometa.fi/api/seo-intel/licenses/validate', {
168
168
  signal: controller.signal,
169
169
  method: 'POST',
170
170
  headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
package/lib/updater.js CHANGED
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * Two update channels:
8
8
  * - npm registry (public installs via `npm install -g seo-intel`)
9
- * - froggo.pro (direct downloads / pro users)
9
+ * - ukkometa.fi (direct downloads / pro users)
10
10
  *
11
11
  * Usage:
12
12
  * import { checkForUpdates, printUpdateNotice } from './updater.js';
@@ -113,7 +113,7 @@ async function checkNpm() {
113
113
  }
114
114
 
115
115
  /**
116
- * Check froggo.pro for latest version.
116
+ * Check ukkometa.fi for latest version.
117
117
  * Endpoint returns { version, changelog?, downloadUrl? }
118
118
  */
119
119
  async function checkFroggo() {
@@ -121,7 +121,7 @@ async function checkFroggo() {
121
121
  const timeout = setTimeout(() => controller.abort(), 5000);
122
122
 
123
123
  try {
124
- const res = await fetch('https://froggo.pro/api/seo-intel/version', {
124
+ const res = await fetch('https://ukkometa.fi/api/seo-intel/version', {
125
125
  signal: controller.signal,
126
126
  headers: { 'Accept': 'application/json' },
127
127
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "seo-intel",
3
- "version": "1.1.7",
3
+ "version": "1.1.8",
4
4
  "description": "Local Ahrefs-style SEO competitor intelligence. Crawl → SQLite → cloud analysis.",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -56,7 +56,8 @@
56
56
  "Start SEO Intel.command",
57
57
  "Setup SEO Intel.command",
58
58
  "Start SEO Intel.bat",
59
- "start-seo-intel.sh"
59
+ "start-seo-intel.sh",
60
+ "CHANGELOG.md"
60
61
  ],
61
62
  "scripts": {
62
63
  "crawl": "node cli.js crawl",
package/seo-audit.js CHANGED
@@ -507,7 +507,7 @@ async function generateReport(rawUrl) {
507
507
 
508
508
  lines.push(`# SEO Audit Report — ${rawUrl}`);
509
509
  lines.push(`**Date:** ${date} `);
510
- lines.push(`**Tool:** SEO Intel (froggo.pro)\n`);
510
+ lines.push(`**Tool:** SEO Intel (ukkometa.fi)\n`);
511
511
  lines.push(`---\n`);
512
512
 
513
513
  // Score card
@@ -596,7 +596,7 @@ async function generateReport(rawUrl) {
596
596
  }
597
597
  lines.push('');
598
598
  lines.push(`---\n`);
599
- lines.push(`*Generated by SEO Intel — froggo.pro*`);
599
+ lines.push(`*Generated by SEO Intel — ukkometa.fi*`);
600
600
 
601
601
  const md = lines.join('\n');
602
602
  writeFileSync(outFile, md);
package/setup/wizard.html CHANGED
@@ -1234,7 +1234,7 @@ input::placeholder {
1234
1234
  <button class="btn btn-gold" onclick="saveLicenseKey()" id="activateBtn" style="white-space:nowrap;">Activate →</button>
1235
1235
  </div>
1236
1236
  <p style="font-size:0.65rem; color:var(--text-muted); margin-top:6px;">
1237
- Get Solo at <a href="https://ukkometa.fi/seo-intel/" target="_blank" style="color:var(--accent-gold);">ukkometa.fi/seo-intel</a> or <a href="https://froggo.pro/seo-intel" target="_blank" style="color:var(--accent-purple);">froggo.pro</a>
1237
+ Get Solo at <a href="https://ukkometa.fi/en/seo-intel/" target="_blank" style="color:var(--accent-gold);">ukkometa.fi/seo-intel</a>
1238
1238
  </p>
1239
1239
  </div>
1240
1240
  <div id="licenseSolo" style="display:none;">