new-term-radar
Daily radar for new AI terms: names of new models, products and repos, caught on X, Hugging Face, GitHub and sitemaps before keyword tools list them.
contextfor.dev reads Reddit, Hacker News, X, YouTube, GitHub, Stack Overflow and more for people asking for what you build, then hands you a short daily list of conversations worth joining. You write
MarketingTypeScript · JavaScriptGitHub @sodown4thecauseOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Finds the developer conversations worth joining across Reddit, HN, X, GitHub and Stack Overflow, and drafts evidence-backed replies you review and post yourself. Next.js on Cloudflare Workers + Neon.
Taken from the repository README
Loading the full README.
Read the full README ↗One low-effort workspace for getting a product found: community listening, SEO, AI visibility (GEO) and content.
Vantage (the product behind contextfor.dev) replaces the separate listening, SEO, AI-visibility, link-building and content tools a founder would otherwise stitch together. You describe your product once, through a short AI interview, and the workspace keeps working in the background:
| Area | Service | Status |
|---|---|---|
| App | Next.js 16 (App Router), React 19, TypeScript, Tailwind v4 | Live |
| Hosting | Cloudflare Workers via OpenNext: Cron, Workflows, Queues, R2, Browser Rendering, rate limiting | Live |
| Database | Neon Postgres + Drizzle ORM (additive migrations) | Live |
| Auth | Neon Auth (managed Better Auth), email OTP | Live |
| Billing | Polar: Pro at $19/mo (founding price), checkout, webhooks and customer portal | Live |
| AI | Vercel AI SDK 7 (tool calling with tool approval) through Vercel AI Gateway | Live |
| Embeddings + RAG | Workers AI embeddings (Qwen3) + Cloudflare Vectorize | Live |
| Embeddings + RAG (next) | Neon pgvector (halfvec) + pg_search hybrid search, Jina v5 embeddings and Jina reranker v3 | Planned |
| Research | Tako Search via AI Gateway, with Linkup as fallback | Live |
| SEO / GEO data | DataForSEO (Labs, SERP, Backlinks, AI Optimization), cached per workspace | Live |
| Search Console | Google Search Console OAuth for first-party SEO data | Planned |
| Collection | Scavio, TinyFish, Firecrawl, HN Algolia, YouTube Data API, Product Hunt GraphQL, RSS | Live |
| Transactional email | Resend (digests and account email from updates.contextfor.dev) | Live |
| Newsletter | MailerLite for opted-in newsletters (news.contextfor.dev) | Planned |
| Bot protection | Cloudflare Turnstile on public endpoints | Live |
| Product analytics | PostHog: funnel events and browser error tracking, proxied first-party | In review |
| Worker errors | Cloudflare Workers Issues (no SDK) | In review |
| CI/CD | GitHub Actions (lint, typecheck, tests, migration drift, bundle-size gate, staging auto-deploy, gated production) | Live |
Now (launch)
Next
Later
SKILL.md so coding and research agents can use Vantage as a skill.Posts are Markdown files in content/blog/. Copy
_template.md to <slug>.md, run pnpm blog:build, and commit both the post
and the regenerated lib/blog/posts.generated.ts. Posts render to HTML at
build time (no filesystem or Markdown parser in the Worker) and ship with
canonical URLs, Open Graph tags, BlogPosting/BreadcrumbList/FAQPage
JSON-LD, and entries in /sitemap.xml, /blog/rss.xml and /llms.txt.
Tables live in lib/db/schema.ts: workspace, source,
document, lead, opportunity_outcome, plus the opportunity/budget/scan and
distribution tables used by the sweep engine. Migrations in
drizzle/ are additive only (expand/contract), so a Worker rollback
always works against the live schema.
| Type | Order |
|---|---|
rss | Direct fetch with conditional GET (ETag / If-Modified-Since) through fetchPublicText |
substack | Publication feed via the RSS collector |
hn | Algolia search + Firebase item enrichment |
reddit | Scavio reddit.search → fixture |
x | Scavio x.search → fixture |
youtube | Scavio comments → TinyFish Fetch/Search → agent → YouTube Data API → fixture |
producthunt | TinyFish Search+Fetch → homepage fetch → agent → PH GraphQL → fixture |
github, stackoverflow, linkedin, alexandria | Native APIs and search |
Every user-supplied URL goes through
lib/http/public-fetch.ts: public http(s) only, no
embedded credentials, no loopback/private/link-local/cloud-metadata hosts,
manual redirect handling, timeout and streaming size caps — on top of
Cloudflare's global_fetch_strictly_public DNS protection.
Multitenancy is enforced at the query layer. Coverage includes
test/workspace-authorization.test.ts,
test/queue-visibility.test.ts, and
test/digest-actions.test.ts; refused digest
mutations never reach the database.
pnpm install
cp .env.example .env.local
# Fill DATABASE_URL (pooled), NEON_AUTH_BASE_URL, NEON_AUTH_COOKIE_SECRET
pnpm db:migrate
pnpm dev
Optional: collector keys (SCAVIO_API_KEY, TINYFISH_API_KEY,
PH_DEV_TOKEN, YOUTUBE_API_KEY), RESEND_API_KEY for digests,
CRON_SECRET to protect the sweep, ALLOW_FIXTURES=true to permit sample data.
Set NEXT_PUBLIC_APP_URL to each deployment's own origin (including staging).
Production-mode digest dispatch fails closed if it is unset; local development
defaults to http://localhost:3000. Configure DIGEST_FROM_ADDRESS with a verified
Resend sender and optionally DIGEST_FROM_NAME.
Digest dispatch isolates workspace failures: selection, delivery or last-sent recording errors count as failures without stopping other workspaces. Skipped or rejected sends never update the last-sent timestamp.
Digests select the active opportunity queue, not legacy leads: current monitoring profile, live same-workspace evidence, updated in the last 24 hours, ranked up to five entries. Email destinations use the same HTTP(S)-only policy as the app. The preferred UTC hour identifies a daily slot; the next cron catches up an elapsed slot across midnight, without sending it twice or less than 20 hours after the previous digest. First-time subscribers catch up the latest elapsed slot because preferences do not store an activation timestamp.
Each sweep handles at most 25 eligible workspaces, oldest attempt first, with a
90-second shared time budget and a 10-second email request timeout. hasMore
reports batch/deadline deferral; later cron runs continue fairly, including when
empty or failing workspaces remain due. A dedicated atomic lease serializes
delivery per workspace; token-fenced completion cannot overwrite a newer claim.
Resend requests use a stable delivery idempotency key derived from the workspace and previous successful send. Resend retains keys for 24 hours. If email is accepted but recording fails, an unchanged retry is deduplicated within that window; a changed payload can be rejected as a conflict and remains failed. This is not an exactly-once guarantee across crashes or the provider retention window. Never manually replay uncertain deliveries without checking provider status.
DATABASE_URL and the Auth base URL into .env.local.
Migrations use the direct (non-pooler) endpoint.openssl rand -base64 32.| Script | Description |
|---|---|
pnpm dev / build / start | Next dev server / build / start |
pnpm test | Vitest suite |
pnpm typecheck | tsc --noEmit |
pnpm lint | ESLint |
pnpm db:generate / db:migrate / db:push | Drizzle migrations |
pnpm cf:build / cf:preview / deploy | OpenNext build + Wrangler preview/deploy |
Worker entry tests run separately: node --test test/worker-entry.test.mjs test/scan-run.test.mjs test/queue-consumer.test.mjs.
Cloudflare Workers, configured in wrangler.jsonc:
contextfor.dev and www.contextfor.dev custom domains, Workers static
assets, nodejs_compat + global_fetch_strictly_public, observability, and
the Browser / AI / Vectorize / R2 / Workflows / rate-limit bindings.
CI/CD lives in .github/workflows: CI runs lint,
typecheck, tests, migration drift and build on every PR and push, plus a job
that measures the Worker bundle against the 10 MB limit and fails the build if
a Worker ever needs secrets again.
Before deploying this change, apply the additive digest migrations to the target
database using its direct Neon endpoint. Automatic staging deployment does not
run migrations; use the manual Deploy workflow with run migrations enabled
for the intended environment. Set that environment's NEXT_PUBLIC_APP_URL before
enabling digest delivery. Keep production deployment gated until the schema and
runtime configuration are verified.
The Cloudflare Git integration runs independently of GitHub Actions. Verify its
production branch, preview isolation and commands in the dashboard; the manual
production gate in deploy.yml does not govern that separate integration.
pnpm deploy
Production schedules 0 * * * * (hourly, UTC) and staging 0 */3 * * *
(every 3 hours). Digests go out at each workspace's chosen hour, and scans are
gated by the plan's scan interval. worker-entry.mjs adds the
scheduled handler missing from the adapter. With the configured SCAN binding,
it starts per-workspace scan Workflows, requests cost rollup, then POSTs to
/api/cron/digest. Without SCAN, it calls /api/cron/tick, which performs the
scan, rollup and digest sweep itself. Both paths use WORKER_SELF_REFERENCE and
Authorization: Bearer ${CRON_SECRET}; digest failures do not fail scan scheduling.
Worker script limits are 3 MB (Free) and 10 MB (Paid). CI measures
.open-next/worker.js and fails the build above 10 MB.
pnpm dev runs the Next dev server on Node, not Workers. Use pnpm cf:preview
to exercise the real Worker runtime.opennextjs-cloudflare build calls fs.symlinkSync, which
needs Developer Mode or elevation; without it the build fails with EPERM from
the default linked pnpm layout recreating .pnpm virtual-store symlinks. This
repo commits nodeLinker: hoisted in pnpm-workspace.yaml as the chosen fix: a
hoisted install writes a flat node_modules with no symlinks, so OpenNext copies
files instead of recreating symlinks. Alternatively, run the build on Linux (WSL,
Docker, or CI). See
docs/operations/2026-10-08-cloudflare-worker-build-and-domain.md.lib/auth/server.ts and app/api/auth/[...path]/route.ts
both defer Neon Auth construction to request time, and CI has a job that fails if
the build ever needs NEON_AUTH_* again.See AGENTS.md for the standard loop, the Superpowers workflow, available MCP servers (agent-browser, Supermemory, Greptile), Cloudflare and Neon operating rules, security invariants, migration conventions and how Greptile reviews PRs.
See .warp/REF_ORCHESTRATOR_SETUP.md for Warp Oz ↔ Ref Plans wiring.