type: user

role: user

content:
I need a quick understanding of what the AgenticLever-website project is and does, so I can write an informed goal statement and greenfield plan for it.

Repo is at `/workspace/extra/projects/AgenticLever` or `/workspace/extra/projects/AgenticLever-website`. Read:
1. The CLAUDE.md at the root of whichever path exists
2. The top-level index.html or README if present (first 80 lines)
3. Any docs/ or api/ folder contents at a glance

I need to understand: What does this app do? Who is it for? What's its current state (working product vs scaffolding)? What's the main functionality? Report in under 200 words.

userType: external

entrypoint: sdk-ts

gitBranch: HEAD

slug: mellow-wobbling-swan


type: attachment


type: message

role: assistant

type: text

text: I'll quickly explore the project structure to understand what AgenticLever is about.

Bash

command: ls -la /workspace/extra/projects/ | grep -i agentic

type: direct

service_tier: standard

attributionAgent: Explore

type: assistant


content: drwxr-xr-x 29 501 dialout   928 Jul 15 20:55 AgenticLever


text: Now let me read the key files:


content:
1	# CLAUDE.md
2
3	This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
5	# AgenticLever
6
7	Static landing page with a lead-capture API. Zero npm dependencies — Bun is both the runtime and the test runner.
8
9	## Commands
10
11	- `bun run dev` — start the site with watch mode
12	- `bun run start:local` — start the production server on `PORT` (default `4173`)
13	- `bun test` — run all tests
14	- `bun test tests/interest.test.mjs` — run a single test file
15	- `bun run check` — tests plus a browser-JavaScript build check for `script.js`
16	- `bun run sync-interests --dry-run` — count locally saved leads waiting for the shared Sheet
17	- `bun run sync-interests` — replay all local leads to the configured Sheet; duplicate IDs are ignored
18
19	## Architecture
20
21	The live static files (`index.html`, `script.js`, `styles.css`, `favicon.svg`) sit at the **project root** — both Vercel (`vercel.json` builds array) and `server.mjs` serve from there. The `public/` directory holds stale copies; do not edit it.
22
23	There are two server entry points that share the same `lib/` modules:
24
25	- **`server.mjs`** — Bun-native server using the Web API (`Request`/`Response`). Used for local dev and any non-Vercel deployment. Serves static files from the project root via `lib/static.mjs` and handles `POST /api/interests`.
26	- **`api/interests.js`** — Vercel serverless function using the Node.js `(req, res)` style. Vercel routes `POST /api/interests` here. This file duplicates some logic from `server.mjs` (rate limiting, notify) because Vercel handlers cannot share the Bun Web API surface.
27
28	### lib/ modules
29
30	- **`lib/interest.mjs`** — validation and persistence for both record kinds. `validateInterest`/`saveInterest` append to `data/interests.jsonl`; `validateDiscovery`/`saveDiscovery` append to `data/discovery.jsonl` (both mode 0o600). The `website` field is a honeypot on both forms: any non-empty value throws `InterestValidationError` with `isSpam: true`, which the handler silently acknowledges with 200 OK.
31	- **`lib/delivery.mjs`** — POSTs a saved record to the Google Sheets webhook. Called after every successful save; failure is logged but non-fatal so the local JSONL files remain the source of truth.
32	- **`lib/replay.mjs`** — reads and validates a JSONL file, deduplicates by `id`, and drives delivery. Used only by `scripts/sync-interests.mjs` for manual recovery (interest records only).
33	- **`lib/static.mjs`** — path-traversal-safe file server backed by `Bun.file`. Only used by `server.mjs`; Vercel handles static files natively.
34
35	### Two-stage contact flow
36
37	Stage 1 (interest) captures name/email/business/location plus one problem ("what task keeps stealing your time"). On success, the panel offers three optional discovery questions modeled on question-led selling (see `docs/discovery-playbook.md`): what would change, what it costs today, what solving it would be worth. Stage 2 is always skippable and stage-1 capture never depends on it.
38
39	- Stage 1: `script.js` → `POST /api/interests` → `validateInterest` → `saveInterest` → `deliverInterest` (Sheet row) → ntfy push
40	- Stage 2: `script.js` → `POST /api/interests` with `kind: "discovery"` + `interestId` → `validateDiscovery` → `saveDiscovery` → `deliverInterest` (enriches the Sheet row matched by `interestId`) → high-priority ntfy push
41
42	Health metric for the flow: stage-2 completion rate = `data/discovery.jsonl` records ÷ `data/interests.jsonl` records (or Discovery ID column density in the Sheet).
43
44	## Testing
45
46	Tests live in `tests/`. Run with `bun test`.
47
48	`tests/api-handler.test.mjs` spins up a real Node.js HTTP server using the Vercel handler (`api/interests.js`) to catch `(req, res)` vs Web API incompatibilities. **Any change to `api/interests.js` must pass this test before pushing** — this runtime mismatch crashed silently on Vercel previously. Note: the handler rate-limits 6 POSTs per 10 minutes per IP; tests that add POSTs must use distinct `X-Forwarded-For` values.
49
50	## Deployment
51
52	- **Vercel**: root static files and `api/interests.js` are declared in the `vercel.json` `builds` array. On Vercel, `/tmp/interests.jsonl` and `/tmp/discovery.jsonl` are ephemeral fallback storage; Google Sheets is the durable store.
53	- **Self-hosted**: `bun run start:local` on any host with `PORT` set.
54
55	## Environment variables
56
57	See `.env.example`. Key variables:
58	- `INTEREST_WEBHOOK_URL` + `INTEREST_WEBHOOK_SECRET` — Google Sheets webhook (both required together)
59	- `NTFY_TOPIC` — ntfy.sh topic name or full URL for push notifications per submission
60	- `INTERESTS_FILE` / `DISCOVERY_FILE` — override the JSONL paths (useful in tests or alternate deployments)
61
62	Google Sheets integration setup and redeploy steps: `integrations/google-sheets/README.md`
63


command: ls -la /workspace/extra/projects/AgenticLever/ | head -30


content:
total 128
drwxr-xr-x 29 501 dialout   928 Jul 15 20:55 .
drwxr-xr-x 72 501 dialout  2304 Jul 16 18:29 ..
-rw-r--r--  1 501 dialout  8196 Jul  6 15:41 .DS_Store
drwxr-xr-x  4 501 dialout   128 Jul 12 18:48 .build
drwxr-xr-x  3 501 dialout    96 Jul  8 13:53 .claude
-rw-r--r--  1 501 dialout   469 Jul  3 08:40 .env.example
-rw-r--r--  1 501 dialout   544 Jun 29 20:46 .env.local
drwxr-xr-x 14 501 dialout   448 Jul 20 08:16 .git
-rw-r--r--  1 501 dialout    62 Jun 29 15:27 .gitignore
-rw-r--r--  1 501 dialout    63 Jun 29 19:48 .vercelignore
lrwxr-xr-x  1 501 dialout     9 Jul 12 18:41 AGENTS.md -> CLAUDE.md
-rw-r--r--  1 501 dialout  4799 Jul  3 08:41 CLAUDE.md
drwxr-xr-x  3 501 dialout    96 Jul  3 08:34 api
drwxr-xr-x  4 501 dialout   128 Jun 29 14:45 assets
drwxr-xr-x  4 501 dialout   128 Jun 29 16:12 data
drwxr-xr-x  5 501 dialout   160 Jul  6 17:40 docs
-rw-r--r--  1 501 dialout   371 Jun 29 19:47 favicon.svg
-rw-r--r--  1 501 dialout 20342 Jul  3 08:36 index.html
drwxr-xr-x  3 501 dialout    96 Jun 29 15:19 integrations
drwxr-xr-x  6 501 dialout   192 Jul  3 08:32 lib
-rw-r--r--  1 501 dialout   592 Jul 15 20:55 observations.md
-rw-r--r--  1 501 dialout   361 Jun 29 19:53 package.json
drwxr-xr-x  6 501 dialout   192 Jun 29 19:53 public
-rw-r--r--  1 501 dialout  5684 Jul  3 08:36 script.js
drwxr-xr-x  3 501 dialout    96 Jun 29 15:39 scripts
-rw-r--r--  1 501 dialout  5988 Jul  3 08:35 server.mjs
-rw-r--r--  1 501 dialout 36869 Jul  3 08:37 styles.css
drwxr-xr-x  9 501 dialout   288 Jul 15 20:57 tests
-rw-r--r--  1 501 dialout   955 Jun 29 20:07 vercel.json


command: find /workspace/extra/projects/AgenticLever -name "README*" -o -name "index.html" | head -5

speed: standard


content:
/workspace/extra/projects/AgenticLever/index.html
/workspace/extra/projects/AgenticLever/integrations/google-sheets/README.md
/workspace/extra/projects/AgenticLever/public/index.html


text: Let me read the index.html to see what the landing page is about:


content:
1	<!doctype html>
2
3
4	    <meta charset="UTF-8" />
5	    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6	    <meta
7	      name="description"
8	      content="AgenticLever builds practical AI-powered workflows for local businesses in Cedar Park, Texas and Morgan Hill, California."
9	    />
10	    <meta name="theme-color" content="#f4efe4" />
11	    <meta property="og:title" content="AgenticLever — Make room for the work only you can do" />
12	    <meta
13	      property="og:description"
14	      content="Practical AI-powered workflows for local businesses in Cedar Park and Morgan Hill."
15	    />
16	    <meta property="og:type" content="website" />
17	    <title>AgenticLever — Practical workflows for local businesses</title>
18	    <link rel="icon" href="/favicon.svg" type="image/svg+xml" />
19	    <link rel="stylesheet" href="/styles.css" />
20
21
22
23	    Skip to content
24
25
26

27
28	          agenticever
29
30
31
32	          What we solve
33	          How it works
34	          About
35
36
37	        Start with one workflow
38
39	        <button
40	          class="nav-toggle"
41	          type="button"
42	          aria-expanded="false"
43	          aria-controls="mobile-nav"
44	          data-nav-toggle
45	        >
46	          Open navigation
47
48
49	        </button>
50

51
52
53	        What we solve
54	        How it works
55	        About
56	        Start with one workflow
57
58
59
60
61

62

63

64
Make room for the work only you can do.

65

66	              We find the repetitive work slowing down your business, then build
67	              practical AI-powered workflows that take it off your plate.
68

69

70	              Show us what’s taking your time
71
72	                See how it works
73	                <svg viewBox="0 0 28 14" aria-hidden="true">
74	                  <path d="M1 7h24M19 1l6 6-6 6" />
75	                </svg>
76
77

78

79	              <svg viewBox="0 0 24 24" aria-hidden="true">
80	                <path d="M12 22s7-6.2 7-13A7 7 0 1 0 5 9c0 6.8 7 13 7 13Z" />


content:
total 32
drwxr-xr-x  5 501 dialout   160 Jul  6 17:40 .
drwxr-xr-x 29 501 dialout   928 Jul 15 20:55 ..
-rw-r--r--  1 501 dialout  4974 Jul  3 08:39 discovery-playbook.md
-rw-r--r--  1 501 dialout 11766 Jul  6 17:40 go-to-market.md
-rw-r--r--  1 501 dialout  8231 Jul  6 17:29 site-improvement-roadmap.md


text:
Perfect! I have what I need. Let me provide you with a concise summary:

## AgenticLever - Project Overview

**What it does:** AgenticLever is a B2B AI-powered workflow automation service for local businesses. It identifies repetitive tasks draining business owners' time and builds practical AI workflows to automate them, freeing up capacity for higher-value work.

**Who it's for:** Small-to-medium businesses in Cedar Park, Texas and Morgan Hill, California—geographically focused, local market approach.

**Current state:** A **production-ready working product**, not scaffolding. It's live on Vercel with full functionality including:
- Static landing page with hero messaging ("Make room for the work only you can do")
- Two-stage lead capture flow (interests + optional discovery questions)
- JSONL-based local persistence + Google Sheets integration
- Rate-limited API with spam filtering (honeypot field)
- ntfy.sh push notifications for submissions
- Comprehensive test suite using Bun

**Main functionality:**
1. **Stage 1 (Interest):** Captures leads with name, email, business, location, and their biggest time-stealing task
2. **Stage 2 (Discovery):** Optional upsell questions (impact value, current cost, solution worth)
3. **API backend:** Dual deployment support (Vercel serverless + self-hosted Bun)
4. **Integration:** Auto-syncs leads to Google Sheets webhook; manual recovery/replay capability

**Stack:** Zero npm dependencies; uses Bun as runtime and test runner. Vercel-deployed with fallback local JSONL files.

This is a mature local lead-gen funnel with solid engineering (rate limiting, error handling, dual-runtime support, integration testing).