尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Multi-year Roth conversion planning for the in-between years: sabbaticals, career changes, starting a business, and early retirement before required minimum distributions.
People describe their situation in a conversation (or a form), and the app finds how much to convert to Roth each year so that lifetime taxes are lowest. Results show the schedule, the tax brackets each conversion fills, and the tradeoffs, in today's dollars. The same tools run inside Claude and ChatGPT through the MCP server.
The codebase still uses the original project name, Lucerna, in package names, paths and docs.
backend/app/engine/ does all the math: federal and state income tax, IRMAA, ACA premium credits, RMDs, Social Security and inflation. It produces a structured reasoning trace, and the model only turns that trace into plain English. The model never computes financial results.dp.py) finds the schedule with the highest after-tax wealth. When the user sets limits (a cap per year, a bracket ceiling), SLSQP (optimizer.py) solves the constrained version, and a bracket-fill curve (curve_strategy.py) checks the result.backend/app/mcp/, tool logic in backend/app/tools/) is the only place tools are defined. The website's assistant is an MCP client of it, so the web app, Claude and ChatGPT all call the same tools.mcp-views/, built into backend/app/mcp/views/). They are built from the same React components in ui/ that the website renders natively.See docs/agent-and-mcp.md for the full agent and MCP design.
┌──────────────────────────┐
Browser ───────▶│ frontend/ Next.js │ Vercel
│ (App Router, Tailwind) │
└────────────┬─────────────┘
│ REST + SSE (/api/*)
┌────────────▼─────────────┐
Claude ────────▶│ backend/ FastAPI │ Railway
ChatGPT ───────▶│ /mcp MCP server │──▶ Anthropic API (website assistant)
│ /api web API, agent │──▶ Postgres (saved scenarios)
│ engine optimizer │──▶ PostHog (analytics, feedback)
└──────────────────────────┘
| Layer | Choice |
|---|---|
| Frontend | Next.js (App Router), TypeScript, Tailwind CSS, ApexCharts plus custom SVG |
| Shared UI | ui/: display-only React components and the Paper & Pine theme |
| Backend | Python, FastAPI, Pydantic, SciPy |
| AI | Anthropic Claude Sonnet, called only from the backend |
| MCP | Streamable HTTP server with MCP Apps Views and lazy OAuth sign-in |
| Auth | Clerk (website sign-in and OAuth for the MCP account tools) |
| Database | Postgres (saved scenarios) |
| Analytics and feedback | PostHog |
| Hosting | Vercel (frontend, Storybook), Railway (backend) |
| Secrets | Doppler |
Requirements: Node 20 and Python 3.11 or newer. The setup script installs both locally if they are missing (no sudo), creates backend/.venv, installs npm packages and sets up git hooks.
.agents/skills/setup-lucerna/scripts/setup.sh
source .agents/skills/setup-lucerna/scripts/env.sh # put the tools on PATH in each new shell
npm run dev # backend on :8000 and frontend on :3000
Everything is optional locally. Without keys, sign-in, saved scenarios and analytics are off, and the rest of the app works. To run the assistant without an Anthropic key, start the backend with the offline stand-in, a rule-based replacement for the model:
cd backend && AGENT_OFFLINE=1 uvicorn app.main:app --reload --port 8000
.agents/skills/run-lucerna/scripts/start.sh does all of this in one step (offline agent, Clerk and PostHog off) and can run several checkouts side by side on different ports.
backend/app/config.py and listed with its default in backend/.env.example. Invalid values stop startup.frontend/src/lib/utils/constants.ts (API_URL reads NEXT_PUBLIC_API_URL, default http://localhost:8000). Clerk and PostHog turn on when their NEXT_PUBLIC_ keys are set.Point any MCP client at http://localhost:8000/mcp, for example npx @modelcontextprotocol/inspector. After changing anything in mcp-views/ or ui/, rebuild the Views with npm run build:views; CI fails if the built Views are out of date.
npm run test:backend # pytest (engine, API, tools, agent, MCP)
npm run test:frontend # Vitest
npm run test:e2e # Playwright across both services (offline agent)
npm run test:all # backend, frontend and the E2E smoke test
npm run lint:all # ESLint and Ruff
npm run format:all # Prettier and Ruff format
npm run format:check
Agent evals (scripted conversations with deterministic checks) live in backend/evals/:
cd backend
python -m evals.run_agent_evals --offline # harness smoke test
python -m evals.run_agent_evals # live model, spends API credit
Storybook is the component catalog: cd frontend && npm run storybook. See docs/storybook.md.
Pre-commit hooks (husky and lint-staged) fix staged files and block commits with remaining errors. CI (.github/workflows/test.yml) runs lint, format checks, the Views build check, backend and frontend tests, then E2E.
| Service | Host | Deploys when |
|---|---|---|
| Frontend | Vercel | A push to master touches frontend/ or ui/ (deploy-frontend.yml). PRs get preview deployments. |
| Storybook | Vercel | Preview builds for PRs that change components. |
| Backend and MCP server | Railway | A push to master touches backend/ (deploy-backend.yml), after tests pass. |
Production secrets live in Doppler, the source of truth for the values set in Railway and Vercel. Never commit secrets; add a new backend setting to Settings in app/config.py and to backend/.env.example.
Tax data (federal and state brackets in backend/data/) is updated once a year with the Update Tax Data workflow. See docs/tax-data-update.md.
frontend/ Next.js web app
backend/ FastAPI service: engine/, api/, tools/, agent/, mcp/, db/
ui/ Shared display components and Paper & Pine tokens
mcp-views/ MCP App Views, built into backend/app/mcp/views/
shared/ Cross-language fixtures (scenario draft, View data)
e2e/ Playwright tests and before/after capture flows
listing/ Claude and ChatGPT directory listing kit
docs/ Design, architecture and process docs
.agents/ Repo skills for coding agents (setup, run, PR evidence)
Roth Conversions Optimizer provides scenario analysis for educational purposes. It is not financial, tax or legal advice.