尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Flouze (French slang): money.
Flouze is a personal expense tracker for iPhone. Open it, log what you just spent in a couple of taps, and see where your money goes day by day.
It ships as a web app (PWA) that installs to the home screen and runs fullscreen like a native app, so releases go out instantly without App Store review. It is built iPhone-first: every screen is designed and tested for the iPhone 16 lineup before anything else.查看完整 README ↗Flouze (French slang): money.
Flouze is a personal expense tracker for iPhone. Open it, log what you just spent in a couple of taps, and see where your money goes day by day.
It ships as a web app (PWA) that installs to the home screen and runs fullscreen like a native app, so releases go out instantly without App Store review. It is built iPhone-first: every screen is designed and tested for the iPhone 16 lineup before anything else.
Built:
/): this month's expenses vs income, and your latest 100 entries grouped by day and hour/new, the pencil button): type the amount, pick a category, optional note and time, save/t/[id]): tap any entry/ledger): this month's spending by category, with shares/profile): account and sign outLater, maybe: older months and search, budgets, offline logging, push reminders, CSV export.
Kawaii / soft neumorphic-editorial: warm cream paper, pastel category colors, soft charcoal type, a doodle cat mascot dreaming of fish. Live reference with sample data at /kit.
Tokens (Tailwind theme in src/app/globals.css, use as classes like bg-cream, text-ink, rounded-card):
| Token | Value | Use |
|---|---|---|
cream / oat / card | #FBF7EE / #F3EADB / #FFFDF9 | Page / chips / sheets and cards |
ink | #2D2B2A | Text, primary buttons (use /60, /40 for secondary text) |
mint peach sky lilac butter rose | pastel + matching -ink | Category cards, tiles and their text |
expense / income | #C4473F / #2F8653 | Money (both pass WCAG AA) |
rounded-card / -tile / -sheet | 18 / 14 / 28px | Cards / icon tiles / sheets |
shadow-soft / -clay / -float | Low-elevation cards / claymorphic icon tiles / floating dock and FAB | |
font-sans | SF Pro Rounded (ui-rounded) | Built into iOS, zero download |
Components (import { … } from "@/components/ui"):
| Component | What it is |
|---|---|
SummaryHeader | Title + Expenses vs Income totals, with the mascot |
Sheet | Rounded card-colored sheet the ledger sits on (includes bottom space for the dock) |
DayHeader | Date pill + weekday chip + day's income / expense totals |
TimeMarker | 14:00 ▸ hour group label |
TransactionCard | Pastel card: clay category icon, title, time, signed amount |
CategoryIcon | Claymorphic tile with the category's doodle icon, in its pastel |
Button | Pill button, primary (ink) or soft (card) |
Fab | Pencil quick-log button, bottom right above the dock |
Dock | Floating pill nav: Dashboard, Ledger, Wallet, Profile |
Mascot | Doodle cat SVG (decorative) |
Categories (label, tone) live in CATEGORIES in src/components/ui/tokens.ts; formatAmount() formats money (negative = expense, true minus sign, Indian digit grouping). Category icons are custom inline SVG doodles in src/components/ui/icons.tsx, drawn to match the mascot, so the kit ships no image files.
iPhone (installed PWA)
│ httpOnly session cookie
▼
Next.js 16 server ── Server Components / Server Actions
│ getCurrentUser() checks the session on every request
▼
Better Auth ── Google OAuth
│
▼
Prisma 6 ── MongoDB Atlas (user, session, account, verification, transaction)
Stateful sessions. Signing in creates a session document in MongoDB, and the browser only holds an opaque, signed, httpOnly cookie pointing to it. Every request looks the session up in the database, so signing out (or deleting the session document) revokes access immediately. Sessions last 30 days and slide forward once a day while you use the app.
Server-first. Sign-in and sign-out are Server Actions, and pages read the user on the server. The browser never loads an auth SDK, and nothing sensitive is sent to the client.
Money and time. Amounts are stored as integer paise (amount is negative for expenses, positive for income), so totals never drift from floating-point rounding. Income is just the income category. Days and hours are grouped in the device's time zone: the app stores it in a tz cookie, and the server formats with it (defaults to Asia/Kolkata).
Rules for new code:
getCurrentUser() from src/lib/session.ts. It redirects to /sign-in when there's no valid session. With Cache Components on, call it inside a <Suspense> boundary.getCurrentUser() itself and scopes queries by user.id. Never trust an id from the client.src/lib/transactions.ts; its functions resolve the user themselves.parseAmount() and shown with formatAmount() from src/lib/money.ts; never use floats for stored amounts.src/lib/db.ts, src/lib/auth.ts and src/lib/session.ts are server-only).cp .env.example .env # fill in the values (see below)
pnpm install # also generates the Prisma client
pnpm db:push # creates collections and indexes
pnpm dev # http://localhost:3000
pnpm test # unit tests for money and date logic
Trying the app without Google: pnpm dlx tsx --env-file=.env scripts/test-session.mts creates a test user and prints a session cookie; set it in your browser for localhost:3000. Add --cleanup to delete the test user and their entries.
| Variable | Where it comes from |
|---|---|
DATABASE_URL | MongoDB Atlas connection string, with /flouze as the database name |
BETTER_AUTH_SECRET | openssl rand -base64 32 |
BETTER_AUTH_URL | The app's public URL (http://localhost:3000 in dev) |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET | See below |
http://localhost:3000/api/auth/callback/google, plus https://<your-domain>/api/auth/callback/google once deployed..env.prisma/schema.prisma. The User, Session, Account and Verification models belong to Better Auth; regenerate them with pnpm dlx @better-auth/cli generate --config src/lib/auth.ts --output prisma/schema.prisma after changing auth plugins.pnpm db:push.Google only accepts localhost or HTTPS redirect URLs, so to sign in from a phone you need an HTTPS URL: deploy (e.g. Vercel), or tunnel your Mac with cloudflared tunnel --url http://localhost:3000. Set BETTER_AUTH_URL to that URL and add its callback to Google.
Open the URL in Safari on the iPhone, then Share → Add to Home Screen.
| Path | What it is |
|---|---|
src/app/(tabs)/ | Dashboard, Ledger and Profile, sharing the dock and pencil button |
src/app/new/, src/app/t/[id]/ | Log and edit screens |
src/components/transaction-form.tsx | The log / edit form |
src/app/sign-in/page.tsx | Sign-in screen |
src/app/actions.ts | Server Actions: sign in / out, save and delete transactions |
src/lib/transactions.ts | Transaction reads, scoped to the signed-in user |
src/lib/money.ts, src/lib/dates.ts | Paise parsing / formatting, time-zone-aware grouping (tested in lib.test.ts) |
src/app/api/auth/[...all]/route.ts | Better Auth endpoints (OAuth callback, session) |
src/lib/auth.ts | Better Auth config |
src/lib/session.ts | getCurrentUser(), the only way to read the user |
src/lib/db.ts | Shared Prisma client |
prisma/schema.prisma | Database schema (MongoDB) |
src/components/ui/ | UI kit components and tokens |
src/app/kit/page.tsx | UI kit reference page |
src/app/brand.tsx | App name, colors, logo, and the iPhone 16 screen sizes |
src/app/manifest.ts | Web app manifest |
src/app/icon.tsx, apple-icon.tsx | Generated app icons |
src/app/splash/[device]/route.tsx | Generated iOS launch screens |
src/app/layout.tsx | iOS meta tags and viewport |
src/app/globals.css | Theme and iOS CSS fixes |
.cursor/rules/ponytail.mdc: Ponytail, keeps agents writing the least code that works (MIT)..cursor/skills/pwa-expert/: pwa-expert skill from curiositech/some_claude_skills, reference for service workers, caching and offline (MIT).AGENTS.md: Next.js 16 notes, iOS caveats and auth rules for agents.