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.
Enoma sends leads from Google directly to your trades business. Live in minutes, first month free.
MarketingHTML · JavaScriptGitHub @jackmclark0709-blipOnlineOwner 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
Loading the full README. The saved excerpt is shown below.
AI-generated business pages for local service businesses (landscaping, plumbing, HVAC, etc.) — one page built to be found by Google and AI assistants, not a generic ten-page site. Free 30-day trial, then $19.99/mo.
Production: enoma.io. Vercel serverless functions (api/*.js, ESM) + static HTML in public/ + Supabase (Postgres + Auth). Stripe for billing, Resend for email, OpenAI for page copy and outreach drafting, GA4 + Search Console for traffic.Read the full README ↗AI-generated business pages for local service businesses (landscaping, plumbing, HVAC, etc.) — one page built to be found by Google and AI assistants, not a generic ten-page site. Free 30-day trial, then $19.99/mo.
Production: enoma.io. Vercel serverless functions (api/*.js, ESM) + static HTML in public/ + Supabase (Postgres + Auth). Stripe for billing, Resend for email, OpenAI for page copy and outreach drafting, GA4 + Search Console for traffic.
Vercel Hobby plan caps this project at exactly 12 serverless functions per deployment. Before adding a new api/*.js file, check ls api/ — if already at 12, extend an existing endpoint or move pure logic into api/_lib/ (excluded from the cap) instead of adding a 13th file.
All gated to [email protected] only, via Supabase session:
/admin/admin-list.html — every business profile/admin/voice.html — voice-driven assistant for revenue/traffic/CRM questions, plus outreach-email drafting/admin/sales-queue.html — Sales Queue, see below/admin/sales-queue.html, backed by api/ga-metrics.js?action=sales_queue and ?action=update_lead_status.
Answers one question: who should I talk to today? It merges the two lead populations that actually carry contact info into a single scored, prioritized list:
contact_submissions rows where business_id IS NULL: people who filled the "get your website" form or asked for the concierge build. First-party interest in Enoma itself.prospects + outreach_messages): local businesses found via Google Maps search filtered to only_without_website, worked through draft → approve → send → reply/claim.api/_lib/lead-scoring.js)Every lead gets a 0–100 score and a tier (hot ≥70, warm ≥40, cold below), from real signals only:
Unit tests: tests/lead-scoring.test.js (pure functions, no network/DB — run via npm test).
Self-serve wizard drop-off (funnel_events) is not turned into individual leads. Those rows carry only an anonymous anon_id — no name, email, or phone — until after a business page is already generated (see public/scripts/funnel-track.js), so there's no honest way to attribute early drop-off to a real, contactable person. It's shown instead as an aggregate "last 30 days" funnel-health panel on the same page (step counts only, not leads).
Both are JWT-gated (Supabase session bearer token, [email protected] only) and were added to the existing api/ga-metrics.js rather than a new file, to stay within the 12-function cap:
action=sales_queue (GET) — returns the scored queue, summary tiles, and funnel-health counts.action=update_lead_status (POST) — mark a raw lead replied/read, or advance a prospect's status (reviewed → drafted → approved, or skipped).Target segments: plumbing is the primary scale bet, landscaping stays as a warm/proof lane, junk removal was evaluated and ruled out.
Real data behind the call — web-presence rate by trade (unfiltered Outscraper pulls, Attleboro MA, ~35–50 businesses sampled per trade — one town, directionally useful, not a large-scale study):
| Trade | No website | Real website |
|---|---|---|
| Landscaping | 24% | 72% |
| Junk removal | 11% | 86% |
| Plumbing | 12% | 88% |
| HVAC | 16% | 84% |
| Electrical | 24% | 76% |
p.js's schema.org mapping (Plumber) and the AI copy-generation prompt (trust badges, offers_emergency) already support this trade correctly — zero engineering cost to add.Known gap, not yet fixed: Outscraper's leads_n_contacts/company_websites_finder enrichment does not appear to actually return email data — confirmed empirically across 250+ real raw listings spanning 5 trades (including businesses with real websites, where an email should almost always be findable), zero email-shaped fields returned anywhere. Every prospect in the pipeline today is phone-only as a result. Don't trust firstEmail()'s guessed field names in handleProspectPull (api/ga-metrics.js) as working until this is separately investigated — likely needs async=true + polling rather than the current synchronous call, but that's unconfirmed.
MA plumbing license bulk data — investigated, not viable today: Massachusetts's plumbing/gas-fitting license system (licensing.reg.state.ma.us / ePlace Portal) is a one-license-at-a-time verification lookup, not a browsable or bulk-downloadable registry. A "Professional Licensing API" exists but requires vendor/municipality-level API access, not self-serve signup. This is a real potential lever (worth a formal public-records request someday), just not something to re-attempt the same way expecting a different result.
Fixed this session: handleProspectPull was reading p.site for a business's website, but Outscraper's actual field is p.website — confirmed against a real raw API pull. prospects.website/found_website had been NULL for every prospect ever pulled until this was fixed; invisible under the default only_without_website filter since Outscraper does that filtering server-side.
Not yet started, none of this exists in the codebase — confirmed via a repo-wide grep for UTM/attribution fields before writing this.
Visitor attribution tracking — the underlying question was "can we know who's visiting via organic search vs. direct vs. an AI assistant, and follow up on their interest." Current state: page_events/funnel_events capture the referring domain, but only per-request, not persisted — so if someone lands via Google then clicks around for five minutes, every later event's "referrer" is just enoma.io itself, not Google. No UTM params, no landing page, no first-touch source captured anywhere.
Real distinction worth keeping straight: an anonymous visitor can't be identified before they submit a form — that's not a tooling gap, it's how privacy-respecting tracking works. (B2B "visitor deanonymization" tools like Clearbit Reveal / RB2B exist and do reverse-IP-lookup tricks, but they're built for corporate-network traffic and would perform poorly against Enoma's actual visitors — small-business owners on home wifi/mobile.) The real, buildable value is at the moment someone does submit a form — that's when attribution can actually attach to a real lead:
document.referrer + parsed UTM params + landing page once per anon_id, persist alongside it in localStorage (extends public/scripts/funnel-track.js).contact_submissions row when a real lead-capture happens (send-contact.js) — needs new columns (first_touch_source, utm_campaign, landing_page).AI-referral traffic specifically: referrer behavior varies by AI product — some pass chatgpt.com/perplexity.ai/claude.ai cleanly, others strip it. GA4 (already connected) has started bucketing some of this natively — check what's actually showing up there before building custom detection. If needed, a cheap addition is matching the referrer against a known-AI-domain list rather than relying on GA4's generic "referral" bucket.
Conversion chatbot — raised again 2026-08-13. Explicitly out of scope for the sales-queue work this session — see the "Sales strategy" section above; the original scoping decision was distribution tooling only, no new product surface (chat widget, SEO pages, referral loops all deliberately skipped). Not decided whether to revisit; flagged, not started.
"Claude Dispatch" — mentioned 2026-08-13, unclear what specific feature/product this refers to. Needs clarification before any work starts — don't guess and build the wrong thing.
outreach_messages and suppression_list (the permanent do-not-contact list) had Row Level Security disabled — publicly readable and writable via the anon key already embedded in the admin pages' page source. Fixed by enabling RLS with no public policies added, matching the existing prospects/funnel_events pattern (service-role-only access — nothing legitimate touches these tables from a browser). Run Supabase's get_advisors(type: "security") after any new table or migration to catch this class of issue early.
All server actions below are on api/ga-metrics.js (function cap) and need the x-admin-secret header.
Automatic preview pages — POST /api/ga-metrics?action=generate_preview&prospect_id=<uuid> (&force=1 skips the qualification gate). Builds an unclaimed enoma.io/<slug> page from ONLY the prospect's own website text + Google Business Profile (api/_lib/preview-generator.js: facts-only prompt, then validation strips numbers not in the source, rating talk, puffery, and badges/bullets with no grounding in the site text). Qualification: 4.5★+ with 5+ reviews, a phone number, and — if they have a website — 2+ failed objective site checks (api/_lib/site-checks.js). The daily crawl now runs this automatically for weak-site prospects before drafting, so the outreach email links their page. Previews stay visitable for 90 days (trial subscription row), noindex until claimed.
Outreach drafts — generateDraftCopy only states verified facts: the preview link and the objective site problems. It no longer claims a prospect is invisible on Google or cites other customers' results.
AI search — api/p.js now renders About / Services / Areas / Why / FAQs / Testimonials into the HTML (api/_lib/page-ssr.js) so crawlers that don't run JavaScript see the content, and emits FAQPage JSON-LD. The client script still re-renders the same sections; keep renderSections in sync with loadProfile() in public/profile.html.
Custom domains — set small_business_profiles.custom_domain (lowercase, no scheme, no www, e.g. grilloplumbing.com), add the domain (and www.) to the Vercel project, and have the customer point DNS at Vercel. middleware.js sends that host's / to api/p, which looks the business up by custom_domain; the canonical URL becomes the custom domain and the page drops out of enoma.io's sitemap.
Monthly results email — action=results_email runs on the 1st (cron). Every claimed, active customer with an email gets last month's visits, taps to call and quote requests. &dry_run=1 returns the emails without sending; &[email protected] sends them all to you to proofread. Idempotent per month (results_email_last_sent_at); results_email_opt_out turns it off for a customer.