Lo-Fi Beats · Chill & Relax
AI-Native Prototype · 2026

Moon — a sales widget for the agent web.

When AI agents start browsing B2B sites on behalf of humans, the wall of marketing copy becomes useless. Moon gives them a structured fit-check and a direct path to book a demo — in one script tag, with zero dependencies.

Vanilla JS·0 dependencies·MIT licensed·Shipped solo in 48 hrs
The Insight

Agents are the new buyer. Most websites aren't built for them.

In 2026, B2B buyers delegate the early research loop to agents: “find me five vendors that solve X, score them, book discovery calls with the top two.” Those agents don't scroll a homepage — they scan it, skim the docs, and move on.

The pages we built for humans are noise to an agent. But the agent isn't the decision-maker; it carries the recommendation back to a person. That makes it the highest-trust referral channel that exists — and the hardest one to win, because it can't be charmed.

Moon is the smallest possible thing a site can do about this: a single script tag that detects the agent, scores fit honestly, and books the demo when the answer is yes.

What the agent sees

A qualification flow, not a wall of copy.

The widget renders inline on the page. An agent that arrives gets an interrupt — structured, brief, honest.

acme-b2b.com
AI agent detected
Hi — are you browsing on behalf of a team?
Tell me a bit about the company and I'll tell you straight whether we're a fit.
Fit score87
Book a 20-min demo →
How It Works

Three things Moon does, in <500 lines of JS.

01

Detects agents

User-agent + behavioral heuristics identify when a request comes from an AI agent rather than a human browser.

02

Scores product fit

Rule-based scoring reads a markdown config (best-fit criteria, dealbreakers, solutions). No LLM inference — deterministic, free.

03

Books a demo — honestly

High fit → opens Calendly. Low fit → says so, plainly. Honest negative assessments become a trust signal the agent carries back.

Install

One script tag. Paste. Ship.

html
<!-- paste before </body> -->
<script
  src=“https://mchaszeyka.github.io/Moon/moon.js”
  data-config=“/moon.config.md”
  data-calendly=“https://calendly.com/you/20min”
></script>

The config is a markdown file you already know how to edit. No build step. No backend.

Key PM Decisions

Four choices I made, and why.

Decision

Rule-based scoring, not LLM

Costs $0 per query, returns the same answer twice, runs fully in-browser. Trust and predictability beat cleverness for a referral signal.

Decision

Markdown config, not a dashboard

Devs already version-control markdown. No CMS to ship, no UI to maintain. Ops teams edit a file, push, done.

Decision

Honest negative assessments

The moment a widget always says "great fit!" the agent learns to ignore it. Saying "not a fit, try X" is how the agent comes back next time it is a fit.

Decision

Vanilla JS, zero dependencies

One <script> tag works on any site — React, Webflow, plain HTML. No bundle bloat, no framework lock-in, no supply-chain surface area.

Build Story

Shipped in 48 hours, solo.

  1. Hour 0
    Spotted the pattern: AI agents browsing on behalf of buyers — static marketing pages are invisible to them.
  2. Hour 4
    Prototyped agent detection in Claude Code. Validated the user-agent + behavior signals on sample traffic.
  3. Hour 18
    Wrote the rule-based scoring engine. Tested against three real B2B configs (SaaS, services, consumer).
  4. Hour 32
    Wired the Calendly booking flow. Added analytics via Google Apps Script — no backend server to host.
  5. Hour 48
    Pushed to GitHub. Enabled Pages. Wrote docs + handoff. Open-sourced under MIT.
1
person
48
hours
0
dependencies
MIT
open-source
Roadmap

What I'd ship next if this had users.

  • A/B scoring configs — serve different criteria based on referrer or campaign
  • Agent behavior analytics dashboard — aggregate scores, drop-off, segment patterns
  • Multi-config segmentation — route Enterprise vs SMB agents to different qualification flows

See the code.

Moon is MIT-licensed and dependency-free. Fork it, read the 500 lines, drop it into your site, rewrite it for your stack. It's meant to be small enough to own.

View on GitHub ↗See more of my work →