尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Care-plan monitoring and monthly client reports for Shopify agencies. Phase 1 is storefront-first: an agency adds a client store by its URL, and StoreCare watches the public storefront. No Shopify app, no client approval.
| Path | What it is |
|---|---|
packages/storefront | Reads a public storefront as StoreCareBot: robots.txt, theme ID/name/version, app scripts, /products.json, and diffs snapshots into change-feed entries. No dependencies. |
apps/worker | Background jobs on pg-boss: hourly storefront diff, 5-minute uptime, daily checkout test (Playwright), daily speed (PageSpeed Insights), alerts (email via Resend, Slack), health score. |
apps/web | Next.js app on Supabase: magic-link sign-in, onboarding (workspace → add store URL → care plan), dashboard, store page with change feed, work log. |
supabase/migrations | Postgres schema with row-level security per agency. |
scripts/probe-stores.ts | The phase 1 check: what can we see on a list of real stores? Results in docs/storefront-check.md. |
Not built yet: the monthly report pipeline (draft → approve → PDF → email), branding settings, client request inbox, billing. The Shopify connector is phase 2.
Needs Node 22.18+ (TypeScript runs natively, no build step for the worker).
npm install
npm test # storefront + worker unit tests
node scripts/probe-stores.ts mystore.com # try the storefront check on any store
Database tests need a Postgres server (any local one works; nothing Supabase-specific):
TEST_DATABASE_URL=postgresql://postgres@localhost:5432/postgres npm test
STORECARE_DEMO=1 NEXT_PUBLIC_SUPABASE_URL=https://demo.supabase.co NEXT_PUBLIC_SUPABASE_ANON_KEY=demo \
npm run dev --workspace @storecare/web
Signs you in as a sample agency (Northline Studio, 6 client stores) with in-memory data from
apps/web/src/lib/demo.ts. The "Check store" step in onboarding still reads the real storefront you type in.
Good for reviewing the UI and for showing the product to agencies.
supabase/migrations/20261027000001_init.sql
(or supabase db push with the CLI).<app-url>/auth/callback as a redirect URL.apps/web/.env.example to apps/web/.env.local, fill in the project URL and anon key, then
npm run dev --workspace @storecare/web.apps/worker/.env.example to apps/worker/.env, fill in the database connection string and a
PageSpeed API key, then node --env-file=apps/worker/.env apps/worker/src/index.ts.
To run one job for one store: node --env-file=apps/worker/.env apps/worker/src/run-once.ts storefront <store-id>.The public site is https://www.storecarehq.com; the agency application is
https://app.storecarehq.com. Both point to the same Vercel project. Marketing sign-in and trial
buttons navigate directly to the app host. Opening the app checks the Supabase session and shows
the user's workspace or login; accounts without an agency continue onboarding.
Set Vercel Production NEXT_PUBLIC_APP_URL=https://app.storecarehq.com, Supabase Site URL to
the same origin, and allow https://app.storecarehq.com/auth/callback. Keep existing old-domain
and local callbacks during migration. Worker APP_URL also points to the app. Deploy these settings
with the host-routing code. Local .env.local URLs must remain local.
Sessions stay on the app host. Existing website sessions require one sign-in on the new host. Previously shared report links and Stripe webhooks remain valid on the old domain. See domain architecture for routing rules and verification.
The landing page's Contact section and the app's /contact page share a form and same-origin
POST /api/contact endpoint. App contact stays available to signed-in agencies with expired plans.
Set RESEND_API_KEY, CONTACT_TO (the receiving inbox), and CONTACT_FROM (a sender verified in
Resend) in the web deployment. REPORTS_FROM is used when CONTACT_FROM is unset. Restart the
local dev server after changing environment variables. Without configuration the form reports
unavailability rather than claiming delivery. Replies go to the visitor's email address; messages
are sent as plain text and are not stored in the application database.
The endpoint validates field sizes, limits request bodies, rejects cross-origin submissions, and
discards honeypot spam. A bounded, per-instance limiter allows five attempts per ten minutes per
Vercel client IP (one shared bucket outside Vercel). This is not a distributed abuse limit: configure
Vercel Firewall rate limiting for /api/contact before exposing it to significant public traffic.
Contact tests use a mocked provider and never send email.
apps/web, same env vars as .env.example..github/workflows/monitor.yml requests a run of apps/worker/src/tick.ts every
30 minutes. GitHub's scheduled triggers are best effort and can be delayed or dropped; this is not a guaranteed monitoring interval.
Each actual run performs uptime checks, a storefront snapshot about hourly, checkout test, speed and site checks once a day
after 06:00 store time, and last month's report drafts from 06:00 on the 1st (catching up until the 5th; an
existing report is never touched), followed by one "ready to review" message per agency. Needs repository
secrets DATABASE_URL (required) and PAGESPEED_API_KEY, optionally DATABASE_CA_CERT, RESEND_API_KEY and
ANTHROPIC_API_KEY (AI-written report summaries). Run it by hand from the Actions tab ("Monitor stores" → Run
workflow); the "force" box runs storefront, speed, site or report straight away.
Missing database configuration fails the workflow. Individual store failures are isolated and logged as they finish;
database connections time out after 15 seconds and statements after 60 seconds. See monitoring operations.docker build -f apps/worker/Dockerfile ., one instance,
runs src/index.ts with pg-boss for 5-minute uptime checks. Env vars from apps/worker/.env.example.StoreCareBot; we never disguise the client to get past a bot check. A bot check
is recorded as blocked, never as down, and a store only becomes "limited" after 3 blocked visits in a row.