尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A mobile web app for iPhone that helps young adults decide whether something they want fits into their month before they buy it. Having the money isn't the same as being able to afford something. The app shows what changes, and the user decides.
Next.js (App Router) · Claude API (claude-sonnet-5-5) via one server route · no database (state lives in the browser for the session).
Open http://localhost:3000. On a laptop it shows inside an iPhone frame; on a phone it fills the screen.查看完整 README ↗A mobile web app for iPhone that helps young adults decide whether something they want fits into their month before they buy it. Having the money isn't the same as being able to afford something. The app shows what changes, and the user decides.
Next.js (App Router) · Claude API (claude-sonnet-5-5) via one server route · no database (state lives in the browser for the session).
npm install
echo "ANTHROPIC_API_KEY=sk-ant-..." > .env.local # optional: without it, the offline engine answers
npm run dev
Open http://localhost:3000. On a laptop it shows inside an iPhone frame; on a phone it fills the screen.
Without an API key everything still works: /api/check returns 503 and the app quietly answers with its local fallback engine (lib/fallback.ts).
Each "Can I afford this?" turn runs on Penny's Claude Managed Agent (agent_01GZ9g1famujx7KVZqZiWkjZ, whose own system prompt holds her training). If the agent fails or is slow, the route falls back to a direct Claude call with prompts/system.txt, and if that fails too, the app's offline engine answers. Users never see an error.
| Env var (Vercel → Settings → Environment Variables) | |
|---|---|
ANTHROPIC_API_KEY | Required for any AI. Without it the offline engine answers. |
ANTHROPIC_WORKSPACE_ID | Optional. If your key isn't scoped to a workspace, the app finds the workspace Penny's agent is in by itself; set this to skip that lookup. |
PENNY_AGENT_ID | Optional. Overrides the agent ID. |
ANTHROPIC_ENVIRONMENT_ID | Optional. Otherwise an environment named penny is found or created on first use. |
PENNY_AGENT | Set to off to skip the agent and use the direct call only. |
| What | Where |
|---|---|
| AI system prompt (voice and behavior) | prompts/system.txt. The JSON format and app rules are added in code (lib/ai.ts), so this file only needs tone and behavior. |
| Scene photos | public/bg/home.jpg, free.jpg, chat.jpg, shelf.jpg (see public/bg/README.md). Missing ones fall back to a warm gradient. |
| Demo screenshots | public/demo/jacket.jpg, lamp.jpg, sunglasses.jpg. If a name or price changes, update DEMO_FILES in lib/demoData.ts. |
| Fixed month numbers and starting plans | lib/demoData.ts |
| Penny, the mascot (expressions) | public/mascot/*.webp (which one shows when: lib/mood.ts). She's also the center tab-bar button that opens "Can I afford this?". |
?demo=1. The flag is saved and removed from the address bar. ?demo=0 turns it off.Option A: Vercel CLI (no GitHub needed)
npx vercel
Answer the prompts (link to a new project, keep the default settings). Then add the key and deploy to production:
npx vercel env add ANTHROPIC_API_KEY production
npx vercel --prod
Option B: GitHub. Push this folder to a GitHub repo, then in Vercel choose Add New → Project → Import. Add ANTHROPIC_API_KEY under Settings → Environment Variables before the first deploy, or redeploy after adding it.
Then share https://<your-project>.vercel.app/?demo=1 with interviewers.
Open the link in Safari → ⋯ → Share → View More → Add to Home Screen (leave "Open as Web App" on). It opens full screen with the mascot icon.
app/
layout.tsx viewport-fit=cover, Apple web-app meta, theme color
page.tsx shell; detects scene photos in /public/bg
manifest.ts Home Screen manifest
api/check/route.ts rate limit → Claude (structured JSON output) → validated result
components/
AppShell, TabBar, DeviceFrame
home/ (Donut, SettingsSheet) free/ (plans, editor sheet) chat/ (Composer, ResultCard)
shelf/ demo/ (Demo files tray) ui/ (Screen, Sheet, Mascot, Icons)
lib/
store.tsx session state (sessionStorage); Demo mode (localStorage)
useSend.ts one path for typed, spoken, photo, card-button and demo messages
check.ts POST /api/check with a 22s timeout; falls back to lib/fallback.ts
ai.ts response schema, app rules for the model, app_state text, output validation
budget.ts / updates.ts money math (always computed in code, never by the model) and plan changes
image.ts resize to 1200px JPEG + 480px thumbnail on the phone; HEIC fallback
useVisualViewport.ts keeps the input bar above the iPhone keyboard
100dvh when the keyboard opens. While it's up, the app sizes itself to the visual viewport, so the input bar sits directly above the keyboard, and the tab bar hides.black-translucent, iOS (still on 26.5) lays out the web app 47pt short and leaves a strip at the bottom unpainted. The @media (display-mode: standalone) block in globals.css works around it.capture attribute, so iOS offers Photo Library, Take Photo and Choose File.