尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗A personalization layer that any charity can drop onto its own website. Online shops remember you: your last order is front and center when you return. Chartitable gives returning donors the same experience. When a donor comes back to a charity's site, the page rearranges itself around them: what their gift has done since their last visit, a thank-you, and one helpful next step. Charities also get a staff dashboard.
Built at Cal Hacks 13.0 (Oct 23–25, 2026) by a two-person team. Live at https://www.chartitable.biz (domain registered through GoDaddy, hosted on Vercel, with a Convex dev deployment behind it). Hosts and the API are also reachable at https://chartitable.vercel.app. This README describes what exists and what doesn't.
Staff pages are PIN-protected. Demo PIN: 6767 (demo data only, test mode, no real payments).
Picture giving $25 to a small charity. A month later you get the same website, the same photo and the same Donate button, with no sign your gift did anything. Small charities usually have no fundraising staff to write back, so donors quietly drift away.
We built for two groups at small, under-resourced charities:
<script> tag and a few marked regions to the site it already has. No redesign.Donations are pooled, so we cannot claim a specific dollar bought a specific thing. Therefore:
claude-sonnet-5-5 turns a donor's structured facts into a headline, a short story and a next step, constrained to a JSON schema. The facts payload is a whitelist: no email, no donor ID and nothing about other donors. The prompt requires every estimate to be introduced with "about" and described as an estimate of a pooled share, and never to add records into a total. The guard checks every output before a donor sees it, and the first view after a data change shows the template while Claude's version is generated for the next view. Where Claude could go wrong (invented numbers, inflated impact, invented names, pressure) is exactly what the guard and the tests target.
docs/handoff/.layer.js embed (reads the signed ?ct= token, stores it per charity, fills the hero, since-last-visit and next-step slots from the donor-view endpoint), the staff impact-update page and four fictional test-host sites, using Impeccable for automated design checks. The test hosts are fixtures for testing the layer, not the polished demo. Later layer work (regions, live updates, motion) came back through Claude Code. Cursor activity and screenshots are logged in docs/cursor-grok-log.md and docs/cursor-shots/.Works, tested, and live on the dev deployment:
/donor-view API (first view template, later views Claude), visits and "since last visit", test-mode donate page, staff update page with photos, milestone emails with an allowlist, and a health page. Engine and seed logic are covered by Vitest unit tests; scripts/e2e-smoke.mjs runs the donation → staff update → donor view path against the live backend.layer.js (about 8.5 KB gzipped) with conditional regions, several layouts per donor state, live polling and motion, running on the Vercel-hosted fictional charity sites./dashboard) with a live mode that reads from Convex (set VITE_CONVEX_URL) and a sample-data fallback if the backend is unavailable.Not done:
<script src="https://chartitable.vercel.app/layer.js" data-charity="<charity-id>" defer></script>
<section data-impact-slot="hero"></section>
<section data-impact-slot="since-last-visit"></section>
<section data-impact-slot="next-step"></section>
<a data-impact-donate href="#donate">Donate</a>
v1 slots stay empty for unrecognized visitors. v2 (additive) lets a site author its own regions with <template> variants per donor state; the layer fills data-ct-* fields with text only, never HTML. Donor links carry only a signed opaque ?ct= token; no personal data appears in URLs. Theming uses --ct-* CSS variables. Full contract: PROGRESS.md, rationale in docs/PLAN_DYNAMIC_SITE.md.
| Folder | What |
|---|---|
engine/ | Pure TypeScript: allocation, facts, prompt, guard, template fallback, tokens, donor state, milestones. Vitest. |
convex/ | Backend: schema, narrative action, /donor-view HTTP endpoint, donations, impact logs, milestones and email, dashboard queries, health. |
layer/ | The embeddable layer.js (esbuild IIFE): regions, conditions, live updates, motion. |
staff/ | Test-mode donate page and staff update page (static). |
demo-sites/ | Fictional charity host sites (test fixtures and contract-v2 hosts). |
dashboard/ | Charity dashboard (Vite + React + TypeScript), live Convex mode with sample-data fallback. |
frontend/ | First-pass static pages (landing, donor view, staff donors). |
seed/ | Fictional charities, donors, donations, expenses and impact logs. |
scripts/ | build-site.mjs (assembles what Vercel serves), e2e-smoke.mjs. |
docs/ | Specs, research, design, prompts, handoffs. |
TypeScript, JavaScript, HTML, CSS, React 19, Vite, esbuild, Vitest, happy-dom, npm workspaces, Convex, the Anthropic API (Claude Sonnet 5.5), Resend, Vercel, GoDaddy (domain), Figma, Impeccable, Cursor, Grok, Claude Code.
layer.js, the staff and donate pages and the demo sites. Only built static files are served.npm install
npm test # engine and seed tests
npm run typecheck
npm run build # layer/dist/layer.js
npm run build:site # assembles dist-site/ exactly as Vercel serves it
npm run dev:layer # serves the layer on http://localhost:5174
Copy .env.example to .env and fill in keys (ANTHROPIC_API_KEY, RESEND_API_KEY, TOKEN_SECRET, DEMO_INBOXES, STAFF_PIN). Never commit .env. The backend needs your own Convex account (npx convex dev); environment variables are set with npx convex env set.
localStorage for 30 days. Production use would need real authentication.Two people at Cal Hacks 13.0: the lead (product engineering, deploys, orchestration of the Claude Code agents) and a teammate (dashboard, design, Figma, Impeccable).