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.