What came before
Visible changes, in public. Each version highlights the most important shipments; the rest lives in the repo's commits.
v0.13.0 · Cross-month CRUD and estimated dates
- Create, edit, and delete expenses and income in past, current, or future months from the dashboard, chat, and Telegram; lines bucket by the real transaction date.
- When you omit a date in chat, Clara uses today and marks it as estimated; CSV/PDF imports keep the date from the statement.
- The agent acts with fewer confirmations on clear one-offs while still confirming bulk imports and deletions.
v0.12.10 · Telegram: CSV and PDF documents
- You can send a bank CSV export as a Telegram document; Clara parses it the same way as in the web chat.
- Tighter PDF/CSV detection (including octet-stream with a .pdf/.csv extension) so real bank files no longer hit “unsupported file type”.
v0.12.9 · Profile & access on user.trefolio.com
- With the unified IdP account, Settings → Profile & access links to the /account hub on user.trefolio.com (display name, password, Google, passkeys); Preferences and integrations stay in Clara.
- Display name and profile picture sync from the IdP together with the daily quota.
v0.12.8 · IdP login picks up trefolio’s language cookie
- When you arrive from trefolio with the shared `trefolio_ui_locale` cookie (e.g. German or French), Clara forwards it to user.trefolio.com before falling back to Clara’s ES/EN toggle.
v0.12.7 · Subscription management only on user.trefolio.com
- Settings → Subscription now only links upgrade and billing management to the IdP; the local Stripe Supporter checkout is gone.
- One-off donations still use Stripe in Clara; the Stripe webhook only records donations.
- Daily quota syncs from the IdP in the background (~60s throttle) so a Stripe cancellation shows up without signing in again.
v0.12.6 · Replies match your message language
- Clara infers the primary language from your latest message (including attachments or transcribed voice) and replies in that language; when unclear, she falls back to your saved preference (English or Spanish).
v0.12.5 · Unified login: link existing Clara accounts
- If you already had a Clara user via Google or email/password and signed in through user.trefolio.com, NextAuth failed with a misleading “Google account not linked” error. We now allow linking the `trefolio-id` provider to the same user by verified email, matching Will’s IdP setup.
v0.12.4 · Unified login: IdP UI matches Clara’s language
- If Clara was in Spanish but your browser preferred another language, the IdP sign-in page sometimes opened in French or another locale. We now send Clara’s UI language via the OIDC `ui_locales` parameter so user.trefolio.com matches the language you were using in Clara.
v0.12.3 · Settings: Pro and billing on user.trefolio.com
- With the unified IdP account, the Settings subscription card now offers “Upgrade to Trefolio Pro” and “Manage billing” links to user.trefolio.com (upgrade + Stripe portal) instead of disappearing when the legacy Supporter upsell is off.
- The daily-cap modal button label now explicitly reads “View plans on user.trefolio.com”.
v0.12.2 · Unified trefolio account: Telegram and the daily cap
- When you sign in with user.trefolio.com, we persist your IdP subject and register Telegram with the IdP too so the same identity maps across apps.
- At the daily message cap, the web modal and Telegram now point to Trefolio Pro checkout on the IdP; the legacy Stripe Supporter upsell stays off while unified IdP billing is configured.
v0.12.1 · Sharing a trip works end-to-end again
- When a friend opened your shared-trip link and tapped "Join via Telegram", they used to hit a generic "We couldn't process your request" error. The auth proxy was intercepting the public accept endpoint and bouncing it to the login page. The path is now exempt and the invite lands where it should: a fresh conversation with Clara on Telegram.
- You can also ask Clara to mint a share-link without opening the web — say "share Málaga with Cyn" or "send me a link to the birthday" and she'll generate a fresh URL and paste it back in chat for you to forward. Same 30-day expiry as the web link.
v0.12.0 · Clara now tells you what she's doing on Telegram
- While Clara thinks, you now see a small status line that updates with each step — "Logging the expense…", "Looking up your banks…", "Preparing chart…". Forward motion instead of three silent dots.
- The status disappears the moment the final reply arrives, so the chat stays tidy.
- Same idea you already had in the web chat: every action is now visible on Telegram too.
v0.11.3 · Every expense keeps its day — even from a screenshot
- Before, when you dropped a bank screenshot, Clara could log transactions with today's date even if they happened a week ago. She now reads the actual date of each line (day, month and year) off the source and saves it correctly.
- If the date in the screenshot is missing, cropped or ambiguous ("Apr", "yesterday", no year), she asks you before logging instead of guessing the day.
- Same for receipts, PDFs and CSVs: the date that appears in the document is the one that lands in your month, not the moment you uploaded it.
v0.11.2 · If Clara picks the wrong event id, your expense still lands
- After the previous fix the model kept slipping a bank id into the event id slot (a real CUID, just from the wrong namespace), and the call failed again with "event doesn't exist".
- Now if the `eventId` doesn't resolve to a real trip of yours, the line is created as a standalone expense anyway and the agent gets a note explaining the mistake so it does not repeat it on the next turn.
- Same for `paidByUserId`: if the value the model sends is not an actual participant of the trip, we fall back to you as the payer instead of blocking the line.
v0.11.1 · Telegram expense logging no longer fails on phantom events
- When you sent a bank screenshot via Telegram and confirmed "yes, log it", Clara would sometimes attach each expense to an invented event (a slash, a comma, the name of the last trip) and the whole batch failed with "event doesn't exist".
- The agent can now only pass real CUID ids for `eventId` / `paidByUserId` — the ones the tool itself returns — and the prompt explicitly tells it to omit the field when no active trip matches instead of guessing.
v0.11.0 · Share a trip and split the bill at close
- Event wallets are now shareable: from the trip detail you mint a link and send it to whoever's coming. You can revoke any link at any time and, for safety, the plaintext link is only shown once at mint time.
- Anyone opening the link joins in one of two ways: with their existing Clara account (one click and the trip appears in their dashboard) or as a Telegram-only guest with no account at all. In the second case we send them straight to the bot and onboard them inside the chat.
- Every shared expense remembers who paid. When the trip has more than one participant Clara asks "did you pay or did Marina cover it?" before logging, so nothing ends up orphaned at split time.
- Live settlement preview on the trip screen: total, fair share per head, what you paid, your balance (owed to you / owed by you) and the suggested transfers. Updates with every expense logged.
- When the trip closes, every participant gets a Telegram summary spelling out: per-head share, what you paid, who you transfer to and how much (or who transfers to you). The organiser absorbs the rounding cent so debtor amounts stay clean two-decimal numbers.
- If a guest later wants a full Clara account, there's a one-page upgrade at `/upgrade-guest` that takes email + password and keeps everything you already logged on the trip.
v0.10.0 · Delete account with a 30-day undo window
- When you delete your account from Settings, it now goes into a 30-day queue: nothing is lost in the meantime and, if you change your mind, you sign back in and tap "Restore my account".
- While queued: chat, APIs and the Telegram daily nudge are paused, and your MCP PAT stops working so no AI client keeps touching data you asked to remove.
- If you have an active Supporter subscription, we cancel it the moment you press delete — we don't wait for the 30 days, so you're not charged another month you won't use.
- We email you at T-7 days and again the day before the purge so the grace window doesn't slip past you. If you've changed your mind, the email button takes you straight to the recovery screen.
- Want it gone immediately? There's an explicit "Skip the grace window" checkbox: tick it and we wipe everything at once instead of waiting 30 days.
- After 30 days, a daily sweep wipes everything in cascade: banks, templates, expenses, messages, savings, MCP tokens and passkeys. Privacy and Terms move to version 1.1 with this change.
v0.9.0 · Daily Telegram reminders
- If you haven't logged anything during the day, Clara sends you a Telegram message at 20:00 in your timezone asking whether you have any income or expense to record.
- Only enabled for users who linked Telegram; a switch in Settings → Integrations → Telegram turns it off any time.
- The messages are AI-written but do not consume your daily agent quota: they are system-initiated turns, not requests you made.
- Timezone is inferred from the country you picked during onboarding; unknown countries default to 20:00 UTC.
v0.8.1 · Telegram is replying again
- Fixed a bug that left Clara silent on Telegram: the webhook was returning 500 on every inbound message (text, photo or voice) because a PDF library loaded eagerly when it shouldn't. Resolved.
v0.8.0 · Event wallets — group every expense from a trip into one line
- Create a wallet for your next trip (or wedding, birthday, one-off event) with a name and date range. While the wallet is open, expenses still live in their real month, but the dashboard groups them under a single collapsible row with the running total.
- Clara figures out you're on the road: when you log an expense whose date falls inside the event's range, she auto-tags it and tells you the running total. If the description doesn't fit (Spotify, rent), she asks before tagging.
- When you close the wallet, pick how to attribute the spend: 'everything to one month' (default — perfect for trips that span months) or 'keep each expense in its real month'. If you reopen later, expenses return to their original months without losing a thing.
- Full coverage: the AI agent and the per-user MCP expose the new tools (`createEvent`, `closeEvent`, `attachExpenseToEvent`, etc.), with explicit confirmation on every MCP write call.
- UI parity: everything chat can do is one click away. Each row in the month view has a menu to tag or detach from an event. The wallet page has an 'Add expenses' action to bulk-attach existing standalone expenses, and you can edit the name, dates and color without leaving the screen.
v0.7.4 · LinkedIn launch polish: hardened MCP, Telegram PDFs, technical i18n
- Per-user MCP: Upstash rate limits + destructive tools require explicit `confirm: true`, matching the web chat rules.
- Public MCP: `?lang=es|en` / `Accept-Language` negotiation and `serverInfo.version` synced from the public changelog.
- Telegram: PDF documents (extracted text + rasterised pages), locale-specific slash commands (en/es).
- API tokens ship with the `clara_pat_` prefix (`ada_pat_` still accepted). README gains a Mermaid architecture diagram and `public/screenshots/` assets.
- CI spins up Postgres so `prisma migrate diff` fails the build on migration drift.
- Neutral-English API errors, English-first Zod tool descriptions, and a Vitest guard against Spanish diacritics leaking into the API/AI layer.
v0.7.3 · Clara cleans up duplicate savings movements
- Tell Clara 'delete the duplicates from my savings' and she first shows you the groups she found (same kind, amount, currency, date and note) so you can confirm before anything is removed.
- When you confirm, she deletes every extra in each group inside a single transaction, keeps the oldest one and rebalances the pile — no risk of drift.
- Only manual movements (`MANUAL_DEPOSIT`/`MANUAL_WITHDRAWAL`) are touched. System entries (monthly contribution, debt coverage, leftover deposits) already have per-month uniqueness and are skipped.
v0.7.2 · Telegram greets you with a step-by-step guide
- The first time you link Telegram, Clara generates the welcome with AI: she greets you, asks whether to start with an income or an expense, and offers 3-4 example prompts you can tap or rewrite.
- Until the account is set up (no confirmed currency or no movements yet this month), every turn nudges you to the next step using the same tools you already know (addIncomeLine, addMonthLine, setPrimaryCurrency).
- If your account was already set up via the web, the static welcome and inline menu stay the same — the guide only appears when it's actually useful.
v0.7.1 · Clara can now delete and subtract savings from chat
- Say 'delete that savings movement' or 'remove the deposit I logged by mistake' and Clara wipes it from the ledger (manual movements only — system ones still need you to redo the carryover decision).
- 'Subtract 50 from the pile' or 'I took 200 out of savings' now triggers a manual withdrawal without leaving the chat.
- Same power via MCP: any AI client of yours can list, top up, withdraw from and delete manual entries on the pile with your permission.
v0.7.0 · GDPR compliance: consent, export, deletion and contact
- Privacy policy and Terms rewritten in full (GDPR Art. 13): legal basis per field, sub-processors with country, international transfers under SCCs, numeric retention windows and your rights spelled out one by one.
- Demonstrable consent: we now record `acceptedTermsAt` and the exact version you accepted. When terms change materially you are asked to accept again before continuing, no quiet edits.
- Settings → Your information: download a JSON dump of everything we hold on you (Art. 15) and delete your account on demand (Art. 17), with re-authentication and automatic Stripe cancellation.
- Public contact channel: new /contact form with Cloudflare captcha — no personal email of the controller is published anywhere.
- An /admin/contact inbox lets the team triage privacy, abuse, bug and support requests with read / replied / archived states.
v0.6.0 · Multiple incomes: salaries, freelance and one-off payments
- Log one-off income for the month (freelance, bonuses, refunds, gifts) without overwriting your salary: each payment is its own line, with a real date and an optional bank.
- Multiple recurring incomes via templates, just like expenses: declare salary + collected rent + retainer once and every new month they show up as pending so you can confirm them when the money lands.
- Multi-currency with frozen FX: if you get paid in USD and your primary currency is ARS, Clara stores the rate at the time of the payment and shows the converted total without lying.
- Tell Clara in chat: "got $250 from a freelance gig", "my salary just landed", "received the bonus" — she records the line for the current month, dedupes if it was already there and confirms.
- New /incomes page to view and edit your income templates, mirror of the expenses templates page.
v0.5.0 · Savings: a global pile with full ledger and integration
- New /savings page: live balance, manual deposits and withdrawals, plus system movements (monthly contribution, end-of-month leftover, debt coverage) explained one by one.
- Each month you can register an informational monthly contribution: it adds to your savings and stays linked to that month, but does not touch the month balance and does not appear as an expense.
- If last month closed in deficit, Clara now asks before opening the new one: cover all (or what fits) from your savings, or carry the debt over. No surprises.
- Available everywhere: chat agent and MCP can read your savings, add manual movements, set the monthly contribution, and cover debt from savings.
v0.4.2 · Email env vars aligned with trefolio
- Clara now reads `APP_BASE_URL` and `APP_SESSION_SECRET` in addition to `NEXT_PUBLIC_APP_URL` / `NEXTAUTH_SECRET`. If you self-host Clara alongside trefolio you can reuse the same variables without renaming anything.
- Verification emails still go out via Resend using the same `RESEND_API_KEY` and `RESEND_FROM_ADDRESS` you already configured for trefolio.
- The equivalence is documented in `.env.example` so spinning up a new deploy is copy-paste.
v0.4.1 · Passkeys + show-password toggle
- Sign in with a passkey: fingerprint, Face ID or USB key. Faster and safer than a password — nothing to type.
- Create, rename and delete passkeys from Settings. Each user can have several (laptop, phone, hardware key).
- Password inputs on login, sign-up and settings now have an eye toggle to show/hide what you typed.
v0.4.0 · Telegram front and centre + captcha and verified email on login
- Telegram is now a top-tier feature on the home page: Clara understands photos, voice notes and text on Telegram with the same brain and quota as the web app.
- Email/password sign-up and login now go through Cloudflare Turnstile (invisible captcha) to keep bots out.
- On sign-up we send a signed link (JWT, expires in 24h) via Resend; you have to verify your email before you can sign in with a password.
- Google sign-in is unchanged: if Google already marks the email as verified, no extra step.
v0.3.3 · Build: Stripe API version matches the installed SDK
- The Stripe client again pins the API version typed by the installed npm package so Vercel production builds pass typecheck.
v0.3.2 · Telegram: long replies and charts no longer abort the send
- HTML chunks no longer split mid-<b>…</b>, which made Telegram reject the whole outbound reply with a parse error.
- If HTML still fails to parse, we retry that chunk as plain text so the rest of the reply can go through.
- If a chart image URL fails, we log and continue with the text instead of failing the entire response.
v0.3.1 · Charts on WhatsApp and formatted replies on Telegram
- When the agent calls renderChart, Clara builds PNG URLs (QuickChart) and sends them before the text on both WhatsApp (Twilio) and Telegram.
- Telegram assistant replies use safe HTML so **bold** from the model renders correctly instead of raw Markdown.
- Disable outbound chart images with CLARA_OUTBOUND_CHART_IMAGES=0 or point to a self-hosted QuickChart via CLARA_QUICKCHART_BASE_URL.
v0.3.0 · Clara now on Telegram
- Link Telegram from Settings → Integrations: we open `t.me` with a short code stored on your row — Telegram caps the `?start=` deep-link payload at 64 characters.
- Same brain as the web: the AI, the tools and the daily quota are shared across web, WhatsApp and Telegram. Send bank screenshots, voice notes or text and Clara replies in your preferred language.
- Private chats land today. Group support (with `@clara` mentions) is on the way.
- If tapping Start did nothing before, that limit was truncating the old signed token; linking now uses a short code that fits the URL.
v0.2.0 · Supporter plan and donations
- When you hit Clara's daily limit, a modal opens with two options: donate any amount (one-time) or upgrade to Supporter for €7.99/mo and raise your cap to 200 queries per day.
- Payments via Stripe Checkout. Card numbers never touch Clara. Cancel anytime from Settings → Subscription.
- Self-hosting stays 100% free. The upgrade page and modal only appear when an admin enables the `quota_upsell` feature flag and Stripe keys are configured.
v0.1.1 · Readable bold in WhatsApp
- Agent replies used Markdown-style **bold**, but WhatsApp expects a single *asterisk* pair. We now convert on send so totals render bold instead of showing raw asterisks.
v0.1.0 · Public launch of Clara
- Public landing with full SEO and support for AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended).
- Public MCP server at /api/mcp so AI assistants can discover Clara.
- Per-user authenticated MCP server at /api/mcp/user with tokens managed from Settings.
- llms.txt and llms-full.txt for LLM discovery.
v0.0.9 · Open Banking with Revolut
- Read-only automatic connection with European banks via Open Banking.
- Per-month sync and matching against planned templates.
- New Settings UI to connect/disconnect and configure the default import bank.
v0.0.8 · WhatsApp as the main inbox
- Voice notes transcribed by Whisper and classified by the agent.
- Audio replies via OpenAI TTS uploaded to Vercel Blob.
- Number linking via one-time code from Settings.