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.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证AI web builder
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Minitebuild generates and hosts a one-page website for a local contractor or remodeler from just its name, city and phone number. It costs $49/month or $529/year. The product name and both prices live in src/config/product.ts.查看完整 README ↗Minitebuild generates and hosts a one-page website for a local contractor or remodeler from just its name, city and phone number. It costs $49/month or $529/year. The product name and both prices live in src/config/product.ts.
How it works:
Lookup. The business is looked up in Google Places: a phone match first, then the top result in the city whose name matches (at least half of the name's distinctive words, so "Elite Remodeling" matches "Elite Remodeling & Design LLC" but an unknown name never borrows another company's listing). Name, address, phone, hours, category and place id are saved. Photos and review text are never requested.
Copy. Claude writes the copy as JSON in a fixed shape: headline, subheadline, services, about, service areas, 4–5 FAQs and a call to action. Services come from, in order:
services column, used as the exact titles;src/lib/content/services.ts), 4–6 of them;A Zod schema checks the copy (length limits, no HTML, no placeholder text), and a second check rejects invented facts: years in business, license numbers, awards or certifications, team size, guarantees or warranties, and reviews or quotes. If either fails, Claude gets one more try with the problems listed. Generated services show as Unconfirmed in the admin until you edit them or click Confirm services.
Site. The site is built from one of three templates (Bold, Classic, Split) and gets a preview at /p/<slug>.
Go live. The owner pays and the site goes live at <slug>.ROOT_DOMAIN.
Every business gets a site. If it already has a website it's tagged has website; if Google can't find it, it's generated from the input alone and tagged unverified.
claude-opus-5-5 by default)Copy .env.example to .env.local.
| Name | Required | What it's for |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | yes | Supabase project URL |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | yes | Publishable key (sb_publishable_…). Used for login and public site reads |
SUPABASE_SECRET_KEY | yes | Secret key (sb_secret_…). Server only; used by the admin panel after the login check |
ADMIN_EMAIL | yes | The only account allowed into /admin |
ROOT_DOMAIN | yes | minitebuild.com in production, localhost:3000 locally |
SALES_PHONE | yes | Shown as "Contact us to activate" on checkout while billing is the stub |
WORKER_SECRET | yes | Added by me. Protects POST /api/worker; pg_cron sends it as a bearer token. Generate with openssl rand -hex 32 |
APP_ANTHROPIC_API_KEY | no | Anthropic key for site copy. Read first. Without it (or ANTHROPIC_API_KEY), built-in sample copy is used |
ANTHROPIC_API_KEY | no | Fallback when APP_ANTHROPIC_API_KEY is not set |
ANTHROPIC_MODEL | no | Added by me. Model for site copy; defaults to claude-opus-5-5 |
GOOGLE_PLACES_API_KEY | no | Without it, fixture businesses are used |
If GOOGLE_PLACES_API_KEY is missing, lookups use fixtures in src/lib/places/fixtures.ts:
has website tag.unverified tag.If neither APP_ANTHROPIC_API_KEY nor ANTHROPIC_API_KEY is set, copy comes from src/lib/ai/fixture-copy.ts. It passes the same schema as Claude's output.
You need Node 20.9+ and Docker (for the local Supabase stack).
npm install
npx supabase start # local Postgres, Auth, Storage, pg_cron
npx supabase status # prints the URL, publishable and secret keys
cp .env.example .env.local # paste those keys; ROOT_DOMAIN=localhost:3000
npx supabase db reset # applies supabase/migrations
Create your admin user (the email in ADMIN_EMAIL). Studio is turned off in supabase/config.toml to keep the stack light, so use the Auth API:
curl -X POST "$NEXT_PUBLIC_SUPABASE_URL/auth/v1/admin/users" \
-H "apikey: $SUPABASE_SECRET_KEY" -H "Authorization: Bearer $SUPABASE_SECRET_KEY" \
-H 'Content-Type: application/json' \
-d '{"email":"[email protected]","password":"a-long-password","email_confirm":true}'
Then start the app:
npm run dev # http://localhost:3000
npm test # unit tests
npm run typecheck # runs next typegen first, so it works on a fresh checkout
npm run lint
Live sites work locally at http://<slug>.localhost:3000. Browsers send *.localhost to your machine without any hosts-file changes.
To let pg_cron run the worker locally, tell it where the dev server is. From the database container, the host machine is the Docker network gateway (usually 172.18.0.1; check with docker network inspect supabase_network_minitebuild):
select vault.create_secret('http://172.18.0.1:3000/api/worker', 'import_worker_url');
select vault.create_secret('<your WORKER_SECRET>', 'import_worker_secret');
Note: the Supabase project connected while building this already had tables (
users,projects,project_segments), so I didn't touch it. Use a new, empty project for Minitebuild, or tell me which project to use.
Create a project at supabase.com.
Apply the migrations in supabase/migrations/. Either:
npx supabase link --project-ref <ref> then npx supabase db push, orThis creates the five tables with row-level security, the site-images storage bucket and the pg_cron job.
Auth. Go to Authentication, then Sign In / Providers, and turn off "Allow new users to sign up". Then go to Auth, then Users, then Add user, and create the ADMIN_EMAIL account.
Keys. In Project Settings, then API Keys, copy the URL, the publishable key and a secret key into Vercel.
Worker secrets. After you deploy, run in the SQL editor:
select vault.create_secret('https://YOUR_ROOT_DOMAIN/api/worker', 'import_worker_url');
select vault.create_secret('YOUR_WORKER_SECRET', 'import_worker_secret');
The cron job (minitebuild-import-worker, every minute) does nothing until both secrets exist. It also only calls the worker when queued rows are waiting.
anon and authenticated. A signed-in user, or anyone holding the publishable key, gets permission denied on every table.requireAdmin() confirms the session belongs to ADMIN_EMAIL. Every server action re-checks this.get_public_site(slug). It's a SECURITY DEFINER function that returns only what a site renders: no notes, tags, input data, place id or billing.claim_import_jobs and invoke_import_worker can only be run by the service role.site-images bucket is public-read. Only the server, using the secret key, can upload or delete.ROOT_DOMAIN to your domain without protocol, e.g. minitebuild.com.minitebuild.com and *.minitebuild.com.ns1.vercel-dns.com, ns2.vercel-dns.com). An A or CNAME record alone isn't enough for *..https://minitebuild.com shows the landing page.https://minitebuild.com/admin asks you to log in.https://<slug>.minitebuild.com.Vercel preview deployments (*.vercel.app) serve the app itself, not customer sites.
/admin. You're sent to /login. Signing in as ADMIN_EMAIL lands on Businesses; any other account sees "This account doesn't have access to the admin panel."Elite Remodeling, Austin, (512) 555-0142 and click Generate site. You land on the business page with the has website tag. Try Unlisted Builders to see unverified. Generate Elite again to get elite-remodeling-austin-2.samples/businesses.csv onto the drop zone. Columns are name, city, phone and an optional services (up to 6, separated by semicolons, 40 characters each).
services cell.http://<slug>.localhost:3000, and the old preview link redirects there.src/
config/product.ts product name and prices (the only place)
proxy.ts hostname routing (Next 16 renamed middleware to "proxy")
app/
page.tsx landing page on ROOT_DOMAIN
login/ email + password login
admin/ businesses, business detail, import, settings, server actions
admin-preview/[id] the admin's live preview (iframe)
p/[slug]/ preview + checkout plan picker
s/[slug]/ live site, robots.txt, sitemap.xml (reached via <slug>.ROOT_DOMAIN)
billing/ stub payment page (dev only) and result page
api/worker queue worker (pg_cron, bearer WORKER_SECRET)
api/billing/webhook billing provider webhook
components/site/ the three templates and shared parts
lib/
content/ Zod schemas, CSV parser, slugs, phone parsing
places/ Google Places client, matching, fixtures
ai/ Claude call, retry-once logic, fixture copy
generation/ pipeline + queue worker
billing/ provider interface, stub provider, idempotent event handler
routing/hostname.ts host -> app | site | 404
sites/ public site reads (cached per slug), SEO, JSON-LD
supabase/migrations/ schema, RLS, queue functions, storage bucket, pg_cron job
public/stock/ stock images per trade
scripts/generate-stock-art.mjs regenerates public/stock
tests/ Vitest
src/proxy.ts. Next.js 16 renamed middleware.ts to proxy.ts; it works the same way.unstable_cache with tag site:<slug>), and every admin edit and billing event invalidates it.<details>/<summary> and the call bar is plain CSS, so the templates add no JavaScript. Next.js still ships its small framework runtime. Mobile Lighthouse on the production build scored 92–96 for performance and 100 for accessibility, best practices and SEO, across all three templates.dangerouslySetInnerHTML. React 19 renders <script> text unescaped, so the LocalBusiness JSON is a plain text child with < escaped.public/stock holds designed illustrations generated by scripts/generate-stock-art.mjs. To use licensed photos, drop JPEGs with the same names (hero 3:2, about 4:3) into public/stock/<trade>/ and update the alt text in src/lib/images/stock.ts.output_config.format) and the server-side refusal fallback (fallbacks: "default") on models that support it.noindex, and robots.txt disallows everything until the site is live again.BillingProvider interface in src/lib/billing/types.ts and is returned from src/lib/billing/index.ts./robots.txt, /sitemap.xml and the page source (title, meta description, canonical, application/ld+json). An unknown subdomain returns a 404.npm run build && npm start, checkout shows "Contact us to activate" with SALES_PHONE. Use Mark as paid in the admin.