Skip to content

Remove OpenRouter logo from Built by Fern trusted-by row - #40

Open
kgowru wants to merge 10 commits into
harden-score-api-and-fern-rerunfrom
kgowru/run-locally
Open

Remove OpenRouter logo from Built by Fern trusted-by row#40
kgowru wants to merge 10 commits into
harden-score-api-and-fern-rerunfrom
kgowru/run-locally

Conversation

@kgowru

@kgowru kgowru commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Removes the OpenRouter logo from the "Trusted by" logo row in the "Built by Fern" CTA section, leaving NVIDIA, ElevenLabs, Twilio, and Adobe.

Verified against a local dev server: the rendered homepage no longer references openrouter-top.svg. Note that the OpenRouter testimonial elsewhere on the page is intentionally untouched.

🤖 Generated with Claude Code

kgowru and others added 9 commits May 17, 2026 14:06
The "Give us your email" timeout link was missing type="button", so it
submitted the surrounding form and re-ran the score instead of opening
the modal. Also retargets the modal copy and Slack message for the
timeout flow (the user wants their score, not a sales demo) and passes
the URL through so the Slack handler knows what to rerun locally.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fix: timeout link opens email modal instead of resubmitting
feat: IP rate limit, URL validation, and FERN_ONLY rerun flag
* feat: switch category inference from OpenAI to Claude Haiku

Replace gpt-4o-mini with claude-haiku-4-5 in the LLM fallback for
category classification. Uses ANTHROPIC_API_KEY instead of OPENAI_API_KEY.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: redirect known duplicate slugs to canonical leaderboard entry

Add a slug-alias map so typing a domain like monday.com (which resolves
to the weaker "monday" slug) lands on the curated leaderboard entry
"developer-monday-com-apps". Applied in the score API and the company
page so both search and direct navigation redirect to the canonical slug.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: keep *.ferndocs.com sites distinct from canonical company slug (#23)

Fern preview/staging hosts (*.ferndocs.com) now always slug by URL
instead of the derived company name, so e.g. docusign.ferndocs.com no
longer collapses onto the "docusign" slug and return the cached live
entry. These sites are now graded as distinct entries.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat: switch category inference from OpenAI to Claude Haiku

Replace gpt-4o-mini with claude-haiku-4-5 in the LLM fallback for
category classification. Uses ANTHROPIC_API_KEY instead of OPENAI_API_KEY.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat: redirect known duplicate slugs to canonical leaderboard entry

Add a slug-alias map so typing a domain like monday.com (which resolves
to the weaker "monday" slug) lands on the curated leaderboard entry
"developer-monday-com-apps". Applied in the score API and the company
page so both search and direct navigation redirect to the canonical slug.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: keep *.ferndocs.com sites distinct from canonical company slug (#23)

Fern preview/staging hosts (*.ferndocs.com) now always slug by URL
instead of the derived company name, so e.g. docusign.ferndocs.com no
longer collapses onto the "docusign" slug and return the cached live
entry. These sites are now graded as distinct entries.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: route monday.com to canonical api-reference leaderboard entry (#25)

* fix: route monday.com to canonical api-reference leaderboard entry

The "monday" alias pointed at developer-monday-com-apps, which has since
been hidden (score 68/D). Repoint to developer-monday-com-api-reference,
the visible canonical entry (score 91/A).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: make slug alias a lookup redirect, never a scoring target

Previously a forced rerun (or dev run) of monday.com would score
https://monday.com and upsert it under the aliased slug
developer-monday-com-api-reference, clobbering the curated A-grade entry.
Now the alias only redirects cache lookups to the existing canonical
entry; scoring always stores under the raw slug.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: reject apex marketing sites that ship an llms.txt (e.g. monday.com) (#27)

An llms.txt returning 200 short-circuited docs detection, so marketing
homepages that now ship one (monday.com) were graded as docs sites. At a
bare apex/root, llms.txt is no longer sufficient on its own; we defer to
the homepage content check (only a visible marketing page is rejected, and
deeper paths / docs subdomains still pass). Also drop the now-unneeded
monday slug alias.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: hard-block monday.com apex so it can never be graded as docs (#28)

The detection layer already rejects monday.com, but the cache lookup runs
before detection — a stale cached row would still be served. Add an apex-only
block (exact host + www, subdomains excluded) that runs before the cache and
scoring, guaranteeing the marketing apex is rejected while developers.monday.com
and other docs subdomains stay gradeable.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: redirect monday.com apex to curated developer-docs entry instead of erroring

Hard-blocking monday.com produced a confusing "not eligible for scoring"
dead-end. Instead, drop the apex block and restore the SLUG_ALIASES entry
(monday -> developer-monday-com-api-reference) so the cache lookup surfaces
the existing curated developer-docs entry and the frontend navigates there.
The detection fix still rejects the marketing apex as a backstop, so
monday.com is never scored; developers.monday.com remains gradeable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: redirect aliased domains in dev too, before docs detection

The monday.com -> developer-docs redirect lived only inside the prod-gated
cache block, so in local dev it was skipped and monday.com hit the "not a
docs site" detection rejection. Resolve an explicit alias up front (dev and
prod, even with force, before detection): if the curated entry exists, return
{ existing: true, slug } so the frontend navigates straight to it. Falls
through to normal scoring only when the curated entry is missing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: add Vitest framework and cover docs-eligibility / monday behavior

Adds Vitest (npm test / test:watch) with no app changes beyond extracting the
testable logic into lib modules:
- lib/docs-detection.ts: detectDocsUrl + the docs regexes (was inline in the route)
- lib/slug.ts: urlToSlug / nameToSlug (was inline in the route)

Tests (25) cover the eligibility logic with a stubbed fetch:
- docs-detection: subdomain/path/platform acceptance, apex marketing rejection
  even when an llms.txt is present (the monday.com case), llms.txt nuance, and
  unreachable-page handling
- blocked-domains, slug-aliases, slug derivation
- monday-behavior: an executable spec — monday.com apex is not blocked, aliases
  to the curated developer-docs entry, and is rejected by detection as a backstop;
  developers.monday.com stays gradeable

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Move the scores data path off Supabase/PostgREST to a Postgres client
targeting a new `agent_score` database on the prod RDS instance, and move
OG images from Supabase Storage to S3 (FER-11415).

App:
- lib/db.ts: pooled pg client (AGENT_SCORE_DATABASE_URL, TLS, singleton)
- lib/og-storage.ts: S3 OG-image upload + public URL (replaces Supabase Storage)
- lib/supabase.ts: rewritten internals to pg + S3, same exported API
  (preserves dedupe-newest-first, blocked-domain filter, ON CONFLICT(slug)
  upsert, hidden/is_fern only-when-provided)
- admin routes (dedupe, scrub-blocked) + ops scripts migrated off PostgREST
- package.json: add pg + @aws-sdk/client-s3, drop @supabase/supabase-js
- .env.example updated for the new env vars

Migration toolkit (scripts/supabase-to-rds-migration/):
- reuses the dashboard toolkit (lib.sh + audit/sync/refresh) with `dashboard`
  added to the reserved-DB guard
- cutover.sh (maintenance-window), migrate-og-images.sh (idempotent
  Storage -> S3), monitor.sh (read-only), config.prod.sh.example, RUNBOOK.md

No live cutover performed; cutover is operator-run per RUNBOOK.md.
…o-rds

FER-11415: migrate agent-score data layer Supabase → RDS (agent_score)
Co-Authored-By: Claude <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
fern-agent-score Ready Ready Preview Aug 10, 2026 8:10pm

Request Review

Brings the FER-11415 data-layer migration (Supabase/PostgREST → RDS Postgres
via lib/db.ts, OG images → S3) onto this branch, which previously still used the
decommissioned Supabase path and crashed at request time.

Conflict resolutions:
- app/api/score/route.ts: adopt main's extracted @/lib/docs-detection and
  @/lib/slug modules (identical logic, now unit-tested) plus the alias-redirect
  block; drop the inline copies.
- lib/slug-aliases.ts: keep this branch's disabled monday alias (#27).
- monday.com behavior: kept this branch's hard-block strategy (#27/#28 — apex
  blocked in blocked-domains.ts, alias off) over main's alias-redirect, and
  updated the three monday test specs to assert the block. All 25 tests pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants