Jeremy Rivera
5b242b225a
Blog: Two Surfaces, Two Timelines ( #278 )
2026-09-03 11:54:23 -04:00
Ben Senescu
ac9ee482d2
Revert "fix(audit): back off and retry on 429 instead of recording the page a…" ( #564 )
...
This reverts commit bb099ad65ae9ac50a6d900c5f61bd0a942661333.
2026-08-28 16:16:44 -04:00
Ben Senescu
ad2d28ea6f
fix(ga4): honor full date ranges instead of clamping to 90 days ( #563 )
2026-08-28 16:15:22 -04:00
Ben Senescu
bb099ad65a
fix(audit): back off and retry on 429 instead of recording the page as blocked ( #562 )
2026-08-28 15:27:23 -04:00
Ben Senescu
accac73e16
feat(billing): collect business name, address, and tax ID at checkout ( #558 )
2026-08-27 18:56:26 -04:00
Ben Senescu
b0248f2acd
release: v0.1.7 ( #554 )
2026-08-27 18:31:03 -04:00
Ben Senescu
749b38118d
fix: show GA4 MCP rows in Claude text output ( #553 )
2026-08-27 18:02:13 -04:00
Ben Senescu
ea162a4391
feat(orgs): multi-user workspaces — roles, invitations, membership enforcement ( #473 )
2026-08-26 16:54:08 -04:00
Ben Senescu
4d7fb661f0
Switch chat agents to GPT-5.6 Luna (max reasoning) ( #499 )
2026-08-26 16:39:51 -04:00
Ben Senescu
61b32ec647
fix: extend OAuth state cookie lifetime to match the 10-minute state TTL ( #544 )
2026-08-26 14:37:46 -04:00
Ben Senescu
b32c0bd841
fix: surface Google connect failures to the user instead of dead-ending ( #549 )
2026-08-26 13:23:20 -04:00
Ben Senescu
9b12e073a8
fix: replace the broken per-key API rate limit with a real 5000/min per-user /mcp limit ( #545 )
2026-08-26 12:09:31 -04:00
Ben Senescu
f35bbb8753
chore: add internal observability-triage skill (query recipes + known-noise filters) ( #540 )
2026-08-26 12:08:50 -04:00
Ben Senescu
11a874ed3b
chore: log Lighthouse runtime errors at warn and include strategy ( #539 )
2026-08-26 11:51:59 -04:00
Ben Senescu
c7ff28c30a
chore: log rank-check live call failures with error code and keyword, warn on upstream flakes ( #542 )
2026-08-26 11:51:26 -04:00
Ben Senescu
824e914eb1
fix(mcp): refuse subscriptions/listen streams — MCP serving is stateless (EVE-95) ( #548 )
2026-08-26 11:48:20 -04:00
Ben Senescu
0abde80109
fix: add 10s timeout to Loops fetches ( #543 )
2026-08-26 11:41:22 -04:00
Ben Senescu
95551a425a
chore: log expected credit refusals in backlink snapshot refresh at info ( #541 )
2026-08-26 11:39:50 -04:00
Ben Senescu
7918fdb8c7
fix: remove duplicate retry:false in useKeywordSerpAnalysis query options ( #547 )
2026-08-26 11:34:57 -04:00
Ben Senescu
022a7f1944
SERP analysis: depth 20 by default, load top 100 on demand; classify DataForSEO timeouts ( #523 )
2026-08-26 11:17:18 -04:00
Ben Senescu
a1c6eb6b11
fix: meta-only-response test used toSorted, banned by the ES2022 lib floor ( #537 )
2026-08-26 10:37:50 -04:00
Ben Senescu
0311e72a96
PostHog reports every server error as affecting as many users as it has events ( #534 )
2026-08-26 10:23:03 -04:00
Ben Senescu
8752269149
Stop cloning the raw Lighthouse report through Zod ( #528 )
2026-08-26 10:11:14 -04:00
Ben Senescu
94b730124b
DataForSEO's own server errors show as an unexpected error and retry 3x ( #526 )
2026-08-26 10:06:40 -04:00
Ben Senescu
67d68281e3
fix(mcp): accept expected partial outputs ( #449 )
2026-08-26 10:04:40 -04:00
Ben Senescu
b631715112
Blank page on older browsers: replace ES2023 array methods with Remeda ( #535 )
2026-08-26 10:02:03 -04:00
Ben Senescu
8db0dd3246
First site audit over MCP fails with a raw billing error ( #525 )
2026-08-26 09:59:35 -04:00
Ben Senescu
25c8f7be26
fix(client): quick fixes for top PostHog errors ( #436 )
2026-08-26 09:48:43 -04:00
Ben Senescu
3fc1f4ec34
fix(dataforseo): accept empty live SERPs ( #451 )
2026-08-26 09:48:32 -04:00
Ben Senescu
ce7570e898
Stop reporting GA4 quota exhaustion as an app exception ( #527 )
2026-08-26 09:40:47 -04:00
Ben Senescu
b592dc5043
fix(mcp): classify project input validation ( #455 )
2026-08-26 09:39:09 -04:00
Ben Senescu
7f9d73102e
Throttle chat store updates to fix React #185 in SAM chat ( #522 )
2026-08-26 09:38:33 -04:00
Ben Senescu
044d712580
Ignore TanStack Query CancelledError in client error tracking ( #524 )
2026-08-26 09:33:43 -04:00
Ben Senescu
fcb35a8145
fix: move the site-audit engine to a dedicated open-seo-audit worker (stops audit OOMs) ( #530 )
2026-08-25 23:12:26 -04:00
Ben Senescu
215ead8152
Replace dataforseo-client SDK with a thin fetch client ( #532 )
2026-08-25 22:23:55 -04:00
Ben Senescu
ac7ebfe13a
Add Dub referral conversion tracking (leads + sales) ( #531 )
2026-08-25 21:49:08 -04:00
Ben Senescu
7a611a7bad
Reorder onboarding source options by observed frequency, add Instagram ( #533 )
2026-08-25 20:49:46 -04:00
Ben Senescu
e0ed902f39
Allow commercial use in hosted terms Section 2.1 ( #529 )
...
Replace leftover 'personal, noncommercial' boilerplate with a license
covering internal business use and client-services work, permit using
generated Outputs in client deliverables, and carve Outputs out of the
Section 2.2 commercial-exploitation restriction.
2026-08-23 21:05:30 -04:00
Ben Senescu
c469a48ae9
Add Cursor marketplace plugin package ( #521 )
2026-08-23 20:18:24 -04:00
Ben Senescu
67f3743002
Update ChatGPT app submission metadata ( #520 )
2026-08-23 18:18:17 -04:00
Ben Senescu
6e02186a2b
Add ChatGPT plugin submission manifest ( #519 )
2026-08-23 18:18:17 -04:00
Ben Senescu
d403954323
Add public support page ( #518 )
2026-08-23 18:18:17 -04:00
Ben Senescu
4ba2d6c175
Require exact hosted MCP origins ( #515 )
...
* Require exact hosted MCP origins
* Clarify exact MCP origin policy
2026-08-23 18:18:17 -04:00
Ben Senescu
e5e961bf48
Audit crawl: conservative OOM retries + window carry-over across chunks ( #517 )
...
* Audit crawl: retry chunks conservatively and stop re-learning the window per chunk
Production audits on heavy-page sites (500-700KB/page) died with
exceededMemory in the first crawl chunk, and the single step retry re-ran
the exact same profile and died again.
- claimChunk now reports isRetry (leftover leases from a dead attempt);
a retried chunk crawls under RETRY_CRAWL_WINDOW (start 3, max 5,
halved byte budget) instead of restarting at window 10.
- The adapted window carries across chunks via durable step results, so
every ~200 pages no longer re-spikes to the initial window.
- First persist sub-batch shrinks to 5 pages so the byte bound sees the
site's page weight before a full 25-page batch is in flight.
- In-flight HTML budget halved to 8 MiB (16 MiB never constrained the
observed ~650KB pages: bound was 25, above the 20 max); growth now
requires a full 25-page sample.
- Parse-time caps: 1,000 extracted links/images per page so mega-menu and
crawler-trap pages can't bloat retained persist batches.
* Guard endWindow for instances replaying pre-deploy step results
* ci: un-export internal-only interfaces (knip)
2026-08-23 18:18:17 -04:00
Ben Senescu
4cd321e269
Blocked-audit alert: point to desktop crawlers instead of support email ( #516 )
...
* Blocked-audit alert: point to desktop crawlers instead of support email
* Soften blocked-audit alert opening
* Partial-block banner: recommend desktop crawlers, drop allowlist tip
2026-08-23 18:18:17 -04:00
Ben Senescu
5cb23418e1
Mask API key values in PostHog replays ( #514 )
2026-08-23 18:18:17 -04:00
Ben Senescu
6470b875ad
Allow SurfMind Chrome extension MCP origin ( #513 )
2026-08-23 18:18:17 -04:00
Ben Senescu
47883b5d5a
Fix GA4 measurement health for sparse API responses ( #512 )
2026-08-23 18:18:17 -04:00
Ben Senescu
b9c1b0255a
Prompting post: add SEO skills overview section before FAQ ( #511 )
2026-08-23 18:18:17 -04:00
Jeremy Rivera
d2bfc256dc
feat(library): add FAQPage JSON-LD to the eight keyword-research spokes ( #240 )
2026-08-23 18:16:42 -04:00