Prismal Logo

How Prismal Planning Works

Pages, features, rules, and data

What Prismal Planning Is

Prismal Planning (prismalplanning.org) is a web budgeting app built around a four-week calendar. Every day on the calendar lists that day's entries (costs and gains), and the budget adds them up into In Bank: how much money will be in your budget's bank account at the end of each day. Recurring entries like paychecks and bills fill themselves in, and so do entries from spreadsheets you connect (like a list of bills you already keep in Google Sheets or Excel), so you can see days where your balance would go negative before they happen, and the lowest your balance gets in the 28 days after the calendar. An account can keep more than one budget, and share any budget it owns with other accounts (see Budgets and sharing). Prismal Planning is for people 18 and older.

This page explains every page, feature, rule, and data format in detail, in plain words, with exact formats and examples, as the website works now: what each page shows, top to bottom; what every button does; the limits; what each feature needs; and how the budget is worked out and stored. It's written so a person, a search engine, or an AI assistant can answer a question about Prismal Planning from this page alone. Each page, top to bottom, Limits at a glance, What each feature needs, and Common questions are good places to start.

Last updated: November 9, 2026 (site version 11.09.2026.B).

1. The Pages

PageAddressSign-inWhat it's for
Front Page/ (/index.html), signed outPublicWhat Prismal Planning is, what it does, and how it works, with Sign In and Create Account fixed at the top of the window (top right, top center on phones), and at the very top, a note that Prismal Planning isn't affiliated with Prism Wallet, Prism Data, Prism Financial, Prism Money, Prism Bill Pay, or anyone else not named exactly "Prismal Planning". Anyone signed out sees it at the site's address, search engines included, and it reads the same without JavaScript.
Login/login.htmlPublicSign in (with the username or email and the password, or a passkey), create an account (18 and older, with Cloudflare Turnstile's check that you're a person; /login.html?new, the front page's Create Account, opens straight to it), Forgot Password, the form a password reset link opens, what an email verification link says, and the one-time question about passkey sign-in. As soon as it shows, it tries the passkey this device last signed in with (not right after Logout or Sign Out Everywhere). Its Home button goes to the front page.
Home/ (/index.html), signed inRequiredThe tabs for the budget's four pages beside Home's buttons (Undo, Redo, New Entry, Search, and Quick Entry), the Getting Started card (the first time a budget opens: a new account's first sign-in, or a new budget), Quick Entries To Add (entries another device's Quick Entry icon added, waiting to be added or deleted), the calendar (Budget Overview), then Lowest in bank after today (with a look at the 28 days after the calendar), Bob (his message; his card opens his page), and Upcoming.
Menu/menu/RequiredLinks to Bob (with his picture beside his name), Spreadsheets & Calendars, Tracker, Paycheck Calculator, Debt Calculator, and Change Logs, each a card with what it's for. (Recurring Entries, History, and Equity are tabs on Home instead.) Its header buttons are Settings, Home, and Logout.
Recurring Entries/menu/recurring.htmlRequiredPaychecks, bills, and anything else that repeats. A tab on Home, like History and Equity.
History/menu/history.htmlRequiredEvery past week, newest first, each day as its date (tap one to zoom in on it, like Home's days: its + adds an entry on that day, and tapping an entry changes it, its title too, without changing any balance), and the same Search as Home's.
Equity/menu/accounts.htmlRequiredAccounts outside the budget, like Savings, Cash (every budget has both), or a credit card, with their balances (each one's balance can be typed in, each can get interest, at its rate and the way it compounds, on the day it's added, kept in the balance or, with Separate Interest, as a balance of its own, and each can have a Max, shown as "$500.00/$2000.00"), each account's panel (tap an account: its name, balance, interest, and Max, and every entry made on it, to change any of them), and at the top, the total of everything with In Bank.
Bob/menu/bob.htmlRequiredBob's page: his highlights, Data, Accounts on any day ahead, Goals, Wavelength Planning (a spectrum of what your money goes to), and his tips, each card but Data and Accounts switched on as you like, each with a Warnings switch that brings what needs a look onto Home.
Spreadsheets & Calendars/menu/spreadsheets.htmlRequiredConnected spreadsheets and connected calendars: add one, change it, turn it on or off, delete it, and see what needs a look (with the note until the email is verified); a calendar's pay settings, and its paychecks and shifts.
Tracker/menu/tracker.htmlRequiredSpending and income by category over the last 4 weeks, 3 months, and 365 days (and the Equity accounts' interest), with a Search through its rows.
Paycheck Calculator/menu/calculator.htmlRequiredWorks out take-home pay from hours, pay rate, deductions, and taxes, with crystals (saved boxes) to fill it in.
Debt Calculator/menu/payments.htmlRequiredWhen a balance owed (a loan or a credit card) is paid off, its interest, what paying extra saves, and the payment to be done by a day; with an Equity account picked, its own pace from the budget and its entries before and after today. It keeps its boxes for next time, and gems (saved boxes) fill it in.
Change Logs/menu/logs.htmlRequiredA record of every change to the budget, each with its own Undo, and a Search through it.
Settings/settings.htmlRequiredBudgets (each one's Open, Share, Rename, Delete, or Leave, invitations, and New Budget), daily reminders (push notifications and a calendar link, and with more than one budget, which one they're about), a theme for this device (one of seven, or a Custom one), language and dates, sounds (music and sound effects on this device), Reduced Motion (the starfield held still, and other animations off, on this device), email (change it, verify it, and Other Emails), birth date (fix one typed wrong), password (change it, or email a reset link), passkeys, signed-in devices (Quick Entry icons and whether they show balances, Sign Out Everywhere), your data and privacy (Download My Data, analytics on this device), and deleting the account.
Quick Entry/quick.html?key=…Its keyA New Entry form for a phone's home screen, with no login, under In Bank today and the lowest it gets (unless Settings turns balances off), with the entries it added that are still waiting, to change or delete. On an Apple Watch it shows just In Bank today and the lowest it gets. Without a key, or with one that stopped working, it goes to the login page. Its Home button goes to Home when this browser is signed in, and straight to the login page when it isn't (a browser whose signed-in pages went 15 minutes without a tap, key, or scroll is signed out), checked at the moment it's tapped. Opened from the home screen as an app, Home opens the site in the phone's browser instead (its login page, which goes on to Home when the browser is signed in), and the app stays on Quick Entry; it comes back to Quick Entry when the app is opened again, wherever it was left.
Privacy Policy & Terms of Use/privacy and terms.htmlPublicThe policy and terms.
How It Works/how-it-works.htmlPublicThis page.
Not Found (404)any other addressPublicShown for missing pages. Far below the first screen (so it looks empty until it's scrolled), a card of starfield controls: a box to type in that pushes the stars, live readouts, and Attract and Repel sliders, styled like the rest of the site (see The Not Found page's starfield controls).

Each Page, Top To Bottom

What each page shows, in order, from the top. Every page starts with the header (the logo and the page's name at the left, its buttons at the right, and on the signed-in pages, the budget picker just above the buttons: see Budgets and sharing) and ends with the footer (and its Help button, where it has one). Floating boxes, Search, and Help aren't in the order: they float over the page when they're opened.

  • Front Page (/, signed out): the header with Sign In and Create Account (fixed at the top of the window); the note that Prismal Planning isn't affiliated with any company or app not named exactly "Prismal Planning"; "Know what's in your bank account every day, four weeks ahead", a few words on what it is, Create Account and See How It Works; What It Is; What It Does (each feature in a line or two); How It Works (four steps to start, Three Kinds Of Entries, a link to this page, and a note that AI assistants and search engines can use this page to answer questions about the site), with Create Account and Sign In; the footer.
  • Login (/login.html): one glass card. Signing in: "Sign In To Prismal Planning", Username or Email, Password, the Turn on passkey sign-in switch (where passkeys work), Login, Sign In With A Passkey, New Account?, and Forgot Password?. Creating an account: "Create Your Account" (for people 18 and older), Username, Email, Birth date (with its calendar button), Password, Verify Password, the Privacy Policy & Terms of Use switch, Cloudflare Turnstile's check, Create Account, and Back to Login. Forgot Password: "Reset Your Password", Email, Send Reset Link, Back to Login. A reset link: "Choose A New Password", Password, Verify Password, Set New Password. After signing in with the switch on: "Turn On Passkey Sign-In?", Yes, Turn It On, and No Thanks. A message under the card says what happened.
  • Home (/, signed in): the header (Prismal Planning, Settings, Menu, Logout); the four tabs (Home, Recurring, History, Equity) beside Home's buttons (Undo over Redo, New Entry, Search over Quick Entry); Getting Started (only the first time a budget opens); Quick Entries To Add (only while another device's quick entries wait); Bob's card, while he has a warning (see Bob's warnings); Budget Overview, the calendar (its months, the weekdays, and four weeks of days); then Lowest in bank after today (with the 28 days after the calendar beside or under it); Bob (his message and More from Bob, which opens his page, and while he has any, his warnings and Okay) beside Upcoming (or Upcoming alone, while Bob's card is over the calendar); the footer with Help.
  • Recurring Entries (/menu/recurring.html): the header; the tabs beside a card with the page's icon, "Recurring Entries", Monthly and Yearly, and New Entry and Edit (in Edit: Delete Selected and Done); "Needs a look" when two recurring entries match; the table (Type, Title, Amount, Start Date, Frequency, End Date), section headings between rows; the footer with Help.
  • History (/menu/history.html): the header; the tabs beside a card with "History" and Search; the weeks, newest on top (Sun through Sat), each day its date with its year; the footer with Help.
  • Equity (/menu/accounts.html): the header; the tabs beside a card with "Equity" and Edit (in Edit: New Account, Delete Selected, and Done); the totals (Total today with In Bank, Total in 6 Months, In Bank today); the table (Account, Balance, and In 6 Months; tapping an account opens its panel, with every entry for it); a note on where balances come from; the footer with Help.
  • Menu (/menu/): the header (Settings, Home, Logout); a card for each page: Bob, Spreadsheets & Calendars, Tracker, Paycheck Calculator, Debt Calculator, and Change Logs, each with what it's for; the footer.
  • Spreadsheets & Calendars (/menu/spreadsheets.html): the header (Back); Connected Spreadsheets (a few words on connecting one; the note and Send Verification Email until the email is verified; each spreadsheet with On/Off and Delete, and Needs a look; Add Spreadsheet; the note about Other Emails); Connected Calendars (a few words on connecting one; each calendar with On/Off and Delete, Paychecks And Shifts, what its last read found, and Needs a look; Add Calendar); the footer with Help.
  • Tracker (/menu/tracker.html): the header (Back); New Entry, Edit, and Search; the table (Type, Last 4 Weeks, Last 3 Months, Last 365 Days, Aliases, with the Interest row under Transfers), section headings between rows; the footer with Help.
  • Paycheck Calculator (/menu/calculator.html): the header (Back); the last results (Take Home, Taxes, Gross); How It Adds Up; Crystals (Add Crystal, ?, Edit Crystals, and the crystals); Calculate a Paycheck (Earnings, Pre-tax Deductions, Taxes, Post-tax, and Calculate); the footer with Help.
  • Debt Calculator (/menu/payments.html): the header (Back, Home, Logout); Gems (Add Gem, ?, Edit Gems, and the gems); Paying It Off (The Balance: Equity account, Balance owed, Interest rate, Compounds, Interest added, On day; Payments: Payment, Every, First payment, Extra each payment, Pay it off by); When It's Paid Off (the results, and Each Payment in a box that scrolls); with an Equity account picked, "(the account) At Your Budget's Pace" and Its Entries (Coming up, then Today and before, in a box that scrolls); the footer with Help.
  • Change Logs (/menu/logs.html): the header (Back); Search; the table (Time, Took, Action, Details, Undo), newest first; the footer with Help.
  • Bob (/menu/bob.html): the header (Back); Bob's Highlights (his picture, and a line from each card that's on); then the cards, each with its ? and, but for Data, its switch (and, while it's on, but for Wavelength Planning, its Warnings switch before it): Data (its rows; a row with a › opens a window, most with a line graph at the bottom, and Equity's window has a table with the day's box at the top of its third column), Goals (New Goal, then each goal), Wavelength Planning (From, To, Add Or Change Wavelengths, the spectrum and its legend, and what isn't on a wavelength yet), Payday, Spending Pace, Big Bills, Weekly Check, Catchup Entries, and Refunds; the footer with Help.
  • Settings (/settings.html): the header (Back); Budgets (every budget, each with its buttons, invitations, and New Budget); Reminders (a switch for each kind, the time, and Reminders are about when there's more than one budget); Push Notifications; Calendar Link; Language And Dates; Sounds; Email (and Other Emails); Birth Date; Password; Passkeys; Signed-In Devices; Your Data And Privacy; Delete Account; the footer with Help.
  • Quick Entry (/quick.html?key=…): the header (Home); In Bank today and the lowest it gets (unless balances are off); Add This Page To Your Home Screen (right after it's set up, with the steps for each phone); Undo, Redo, and Waiting; the form (New Entry: Title, Refraction Type, Equity account, Amount, Date, Placeholder, Add Entry); Prisms (Add Prism, ?, Edit Prisms, and the prisms); the footer with Help. On an Apple Watch, just In Bank today over the lowest it gets.
  • How It Works (this page), the Privacy Policy & Terms of Use, and Not Found: the header (Back, Home), the page's text, and the footer (Not Found's starfield controls are far below its first screen).

Forms ask in the same order everywhere: a title, then the refraction type and the Equity account (an account picked first, so the amount can be a % of it), then the amount, then dates, then switches (like Placeholder), then the buttons (the recommended one first). New Entry: Title, Refraction Type, Equity account (and From, for a Transfer with an account picked), Amount, Date, Placeholder (and Delete it after, while it's on), Add Entry, Cancel. An entry's options: the entry, its notes, Title, Refraction Type, Equity account (and From), Change the amount (Set to or Add to it), Amount, Move to, Placeholder (and Delete it after), Save, Delete, Cancel. A recurring entry: Title, Refraction Type, Equity account (and From), Amount, Frequency, Start Date, End Date, Placeholder (and how many days after each day to delete it). A goal: Title, For, Amount, By. A connected spreadsheet's parts: Date, Title, Refraction Type, Equity account, Amount. A connected calendar: its link, Name, Its Paychecks (Paychecks' title, Refraction Type, Equity account, Placeholder), Pay (its versions; Paydays, Pay, Hours And Overtime, Pre-tax Deductions, Taxes, Post-tax), Pay By Event Title, Which Events Count, then what it finds.

Things Every Page Shares

  • Header: the logo and the page's name (on Home and its tabs, "Prismal Planning" with its tagline, Track • Plan • Learn) at the left, and the page's buttons at the right, each an icon over its name on a glass tile (Back, Home, Menu, Settings, Logout, depending on the page; Logout only shows while signed in, so the public pages don't offer it to visitors). Home, Recurring Entries, History, and Equity have Settings, Menu, and Logout; the menu's pages (Spreadsheets & Calendars, Tracker, Paycheck Calculator, Debt Calculator, Change Logs) have Back, which goes back to the page that opened them (the menu, unless another page did); other pages, like Settings, How It Works, and the Privacy Policy, have Back, which goes back to the page before. Home's button in a header is a green house and Back's a red arrow, each with a gradient like Menu's (the tabs' icons and Home's Undo keep their own).
  • The budget's four pages as tabs: Home, Recurring Entries, History, and Equity share one layout: under the header, the four pages as tabs at the left (each an icon and its name; the one showing glows, with a small neon dot at its left, and tapping it does nothing), beside a glass card with the page's own buttons (on the other three, the page's icon and title over them), then the page itself in a glass card. On the narrowest phones (under 360 pixels wide), the tabs sit two by two above that card instead, and under 340 pixels the header leaves out the tagline. Going from one of these pages to another by its tab, the header and the tabs stay put (a page scrolled down glides back to its top first) while the rest of the page slides down and away, and the next page's slides up into place under them. Meanwhile the tab's bright edge (and its dot) slides up or down from the page that was showing to the tapped tab, and the light inside the tab fades from one into the other in the same time, so the tapped tab already looks just like it will on the next page.
  • The look: glass cards, tabs, and buttons (dark navy, see-through enough for the starfield, with a faint blue edge) over the starfield, light text, and neon blue and violet accents. Things that glow (the page that's showing, today on the calendar, Quick Entry) have a blue-violet radial gradient from their center, a bright edge, and a glow around them.
  • Buttons, the same everywhere (Home's are the model): a button that can be tapped is bright glass with a light edge, and under the pointer it grows a little while its edge brightens and glows blue-violet. The recommended one in a form or card (Save, Add Entry, Add Account, Set It Up, Sign In, Download My Data) glows like Home's Quick Entry button: a blue-violet radial gradient from its center over a blue-to-violet fill, with a bright edge. One that's not recommended (Delete, Sign Out Everywhere, Delete Account) is darker, with muted red words, and one that can't be used right now (like Undo with nothing to undo) is darker and dimmed. Only a chosen one is red-orange: the picked refraction type, account, Cost or Gain, $ or %, Set to or Add to it, an open ? and an open date picker's button get a red-orange diagonal gradient border, a red glow, and a red radial gradient from their center.
  • Boxes to type in have a thin edge that brightens a little under the pointer; the one being typed in gets a bright blue-violet edge. Nothing about them grows or glows.
  • Colors of entries: wherever an entry shows (a day, Upcoming, an account's panel), a cost's words are red, a gain's green, and a $0.00 entry's a darker grey; a placeholder's are yellow whatever its amount. The lines the budget writes itself (In Bank, Gains, Costs, and the 28-day lines) stay the day's light grey: a day whose In Bank is below $0 turns red itself, and its In Bank line has the red ⛔️ triangle. A cost on a day like that is a lighter red, so it stands out on the day's own red.
  • Pill switches: on/off choices (agreeing to the Privacy Policy & Terms of Use, Turn on passkey sign-in, a tracker row's Count ⭕️ Transfers, an Equity account's Add interest, each Search title's Exact, an Equity account's Separate Interest, each connected spreadsheet's and calendar's On/Off on the Spreadsheets & Calendars page, Settings' Show balances on Quick Entry icons, Bob's cards' switches and their Warnings, and an entry's Placeholder, whose word is yellow) are pill-shaped switches: off is a dark pill with its knob at the left, on fills with the red-orange gradient with its knob at the right. Tapping the words flips them too. Checkboxes that pick rows from a list (search results, and the rows to delete in Edit) stay checkboxes.
  • Animated starfield background and page transitions: pages slide in and out instead of flashing, as if they sat side by side: a page slides out one way, and the next one slides in the same way. Going to the Menu or one of its pages slides left, and going Home or back from them slides right. Quick Entry and the Privacy Policy slide right to open and left to leave. Settings slides down into view, and back up to leave. Signing in slides left, and signing out (any way: Logout, Sign Out Everywhere, or after 15 idle minutes) slides right. Between the budget's four pages, only the part under the tabs slides (down and away, and the next page's up into place). Anything else, like How It Works, slides down and away, and the next page up into view, and so does a page opened from somewhere else or reloaded. A page the browser brings back just as it was left (with Back or Forward) slides back the way it went. While a page slides out, the next one starts loading, and it opens as soon as the last one is out of sight, so the pause between them is short. While a page slides in, it stays at its top, so it never lands scrolled down (a link to a spot on a page, like #search, scrolls there once it's in place), and a page sliding up or down moves only what's on the screen, so the rest of a long page never runs past. The starfield's stars carry over from page to page, and react to the pointer, taps, and (secretly) the keyboard: see The starfield background.
  • Floating cards: the page's cards hover in place: the header's buttons and the budget picker, the tabs, the page's buttons, the calendar and the cards under it, the Menu's links, Bob's cards, Settings' cards, and the login page's card. Each drifts a few pixels around its spot in a slow loop of its own (no two move together), and only while it's on the screen or close to it. A card holds still while a day in it is zoomed in or held bigger, so the day stays over the dimmed page. Settings' Reduced Motion (Turn off other animations), or the device's reduced motion setting, holds them all still.
  • Themes: Settings' Theme picks how the site looks on that device: Prismal (the look this section describes), Professional, Dark, Spooky, Elements, Poison, Blue, Fall, Winter, Festive, Floral, Digital, Love, Clovers, Playful, Mechanical, or a Custom one (see Themes).
  • Sounds: soft crystal sounds, made for the site. A single twinkling ding for anything that says yes (like Save, Add, Sign In, or a switch turned on), a quick crystal shatter for anything that says no (like Delete, Cancel, ×, Sign Out, or a switch turned off), a smaller, gentler twinkle for any other button, a soft shimmer that's easy to miss for anything else that's tapped (a day, a box, an entry), and a twinkling crystal rolling across other crystals, starting and ending softly, as a page slides out. On the signed-in pages there's music too: a quiet bed of soft, far-off twinkles that runs the whole time (one every 1.4 to 3.2 seconds, each about 2.6 seconds long, so they blend, played lower and softer), and now and then (every 7 to 18 seconds) a clearer few. Browsers only let a page play sound after a tap, so nothing plays before the first one. On an iPhone or iPad the sounds mix with your own audio instead of stopping it (and the silent switch silences them). Something that takes the speaker (like a call) pauses them, and the next tap plays them again. Settings turns music and sound effects on or off for each device.
  • Footer: trademark note, contact, Privacy Policy & Terms of Use, and How Prismal Planning Works.
  • Help button (the word Help, in a small pill) at the bottom of the page, just under the footer's line, on Home, Equity, Recurring Entries, Tracker, History, Paycheck Calculator, Spreadsheets & Calendars, Settings (its Help covers the account's email and birth date), and Quick Entry (adding it to the home screen, opening it from the Lock Screen, and In Bank on a watch, with steps for each kind of phone). It opens that page's help in a box that floats over a dimmed page; ×, Escape, or tapping outside closes it.
  • Floating boxes: boxes like New Entry, an entry's options, and the panels for recurring entries, tracker rows, and accounts float over the page, so nothing under them moves. So do Search (with its results under its form) and Help. Each one zooms out of the button (or entry) that opened it and back into it when it closes, and has a deep violet to navy glass background. One can open over another (a connected spreadsheet's ➕ boxes open over its panel, and an entry's options over an account's panel): the one under it waits, dimmed, and comes back when the top one closes; Escape closes only the top one. Leaving the page closes them right away (and zooms a zoomed day back out), so the browser's Back button never brings a page back with one still open. A box placed by what opened it (an entry's options, a goal) is placed again whenever its size changes, so it never runs past the bottom of the screen.
  • Floating boxes are part of the page: a floating box (and the date picker, Search, and Help) opens on the part of the page that's on the screen, at its normal size, even when the page is pinch-zoomed in. From then on it stays put on the page: scroll the page and it scrolls with it, and pinch-zoom the page and it zooms with it, so you can zoom in on a box, or scroll to the rest of a tall one, the same as anything else on the page. A box never scrolls inside itself: a tall one (like a long Help, Search with its results, or an account's panel) runs past the screen's bottom, and the page scrolls to the rest of it (boxes inside one that scroll, like an account's entries, Search's results, or a note, still do). One that runs past the end of the page itself (a long Help on a short page) makes the page longer, with a little room under it, until it closes. A zoomed day works the same way. Once every box is closed, the next one opens wherever the screen is then.
  • Notes stay in sight: notes (like "Undone: …"), the countdown before an idle sign-out, and the version number in the bottom left corner sit on a layer that always follows the screen, at their own size, over everything else, however the page is scrolled or zoomed.
  • Signed out, a page that needs signing in goes to the login page. The site's own address shows the front page instead.
  • Without JavaScript, pages other than this one and the front page only ask you to turn it on, since nothing works without it. The same goes for a browser that blocks site data (cookies and site data turned off): signing in is kept there, so the login and budget pages say how to allow it, while the front page, this page, the Privacy Policy, Quick Entry, and Not Found still work.
  • Less motion: Settings' Reduced Motion can hold the starfield still, and turn off the other animations, on that device. When the device itself asks for reduced motion, pages appear without sliding, links go right away, cards don't float, and the starfield doesn't run (see Reduced motion).
  • Notes (like "Undone: …") show at the bottom of the screen for a few seconds; two at once stack instead of covering each other.
  • Missing images show their words instead of a broken-image icon, so a button still says what it does.
  • Sprites: the special emoji show as the site's own small images on every page, the same on every device: the entry types as circles (❗️ Regular red with an !, ✖️ Hidden purple with an X, ⭕️ Transfer green with an =), ✔️ Recurring a blue ring and ➕ (a connected spreadsheet's) a yellow plus, and the lines the budget writes itself as triangles (✅ In Bank green and ❇️ Gains blue, pointing up; ⛔️ In Bank below $0 red and ✴️ Costs orange, pointing down; see Sprites). The text underneath keeps the emoji.
  • Other languages: the site is written in English, and the browser's own translation (in Chrome, Edge, Safari, or Firefox) shows it in another language. The person's entries, names, amounts, and dates are marked to stay just as they were typed (translate="no"), and the site's own words translate. Settings says how to turn it on.
  • Dates show, and are typed, in the device's date format (like 10/05/2026, 05/10/2026, or 2026-10-05), or the one picked in Settings. They're always stored the same way (see Dates, time zones, and formats).
  • Picking a date: every date box (New Entry, on Home and the Quick Entry page; an entry's Move to; Recurring Entries' Start and End Dates; Search's From and To; and the birth date on Create Account and in Settings) has a calendar button beside it (a glass button with a small calendar drawn in thin light grey lines, like the site's other small marks), instead of the device's own date picker. It opens a small calendar under the box, in the look of Home's calendar: a square glass day for each date with one big number, the weekdays over them, and at the top the month and the year side by side, each a box to type in (a list of months, or of years, shows under it while it's picked, narrowing as it's typed, and clicking the box again brings it back; it scrolls on its own with a finger or the mouse wheel, never moving the page, and Enter, a click, or a tap on one goes there while the calendar stays open, while a finger that slides to scroll the list picks nothing), with ‹ and › on either side of the month, for the month before and after, and the year after them. Picked with a finger, the box lets go, so a phone's keyboard goes away. Today glows, the date that's typed has the red-orange edge, the days of the months before and after are faint, and days that can't be picked (like a birth date in the future, or a day outside History when moving a History entry) are dimmed. Today (when today can be picked) and Close are at the bottom. A tap on a day fills in the box and closes it; Escape or a tap outside closes it too. On a keyboard, the arrows move a day or a week, Page Up and Page Down a month, Home and End to the week's ends, and Enter or Space picks.
  • Links within the site slide the page out first. Links to a spot on the same page (like this page's Contents) just scroll there, and links opened in a new tab (Ctrl or ⌘ click, or the middle button) open there as usual.
  • Idle sign-out warning: on signed-in pages, the last minute before the 15-minute idle sign-out shows a notice counting down; any tap, key, or scroll keeps you signed in. A page left in the background just signs out when it's opened again, and the login page then says why.
  • Saving safely: every change saves right away. If the server can't be reached, the change is kept on the page and sent again when the connection comes back (and every 30 seconds until then), and leaving the page before then asks first. If the budget was saved on another device or tab since the page loaded, the page reloads with the newest budget instead of saving over it (see How the website is built).
  • Live updates: two devices (or two people sharing a budget) with it open see each other's changes within about 5 seconds, with no reload: a new entry, a changed recurring entry, a tracker row, an account, a quick entry added from a Quick Entry icon, anything. While a page is on the screen, it asks the server every 5 seconds whether the budget changed (and whether quick entries were added, changed, or taken back), and when one did, it loads the budget again in place and redraws (a zoomed day stays zoomed, and open Search results are found again). It waits while something here isn't saved yet, while a box (panel) is open, while a page is in Edit, while a row is being dragged, or while a box the page would draw again is being typed in (like the Paycheck Calculator's, until it's calculated), then catches up. A page off the screen doesn't ask; it checks the moment it's back.

Steps For Each Phone

Steps that are different on each kind of phone (adding the Quick Entry icon to the home screen, opening it from the Lock Screen, checking In Bank on a watch, and finding the reduced motion setting) come with a Steps for list over them: iPhone or iPad, Samsung Galaxy, Google Pixel, OnePlus, Motorola, Xiaomi (Redmi and POCO too), another Android phone, or a computer. It starts on the kind of device it's open on (Chrome on Android doesn't say the phone's maker in the browser's name, so the page asks the browser for its model when it can) and shows only that kind's steps. Picking another kind shows its steps in every such list on the site, and the pick is kept on that device (prismal_device), even after signing out. Without JavaScript (like search engines reading this page), every kind's steps show, each under its name.

iPhone or iPad

Add to the Home Screen: in Safari, tap Share (on newer iPhones it can be under ⋯ first), then Add to Home Screen.

Samsung Galaxy

Add to the home screen: in Samsung Internet, ☰, then Add page to, then Home screen; in Chrome, ⋮, then Add to Home screen.

Google Pixel, OnePlus, Motorola, or another Android phone

Add to the home screen: in Chrome, ⋮, then Add to Home screen.

Xiaomi, Redmi, or POCO

Add to the home screen: in Chrome, ⋮, then Add to Home screen. If no icon shows up, allow Chrome's Home screen shortcuts (Settings, Apps, Manage apps, Chrome, Other permissions).

A computer

Bookmark the page (Ctrl+D, or ⌘D on a Mac).

Login

  • Create an account: a username (5 to 30 characters, and any characters you can see work: letters in any language, numbers, symbols, emoji, and spaces), an email address, your birth date (typed, or picked with the calendar button; Prismal Planning is for people 18 and older: under 18, no account is made, and the server refuses it too), a password of at least 8 characters (any characters, typed twice), and agreeing to the Privacy Policy & Terms of Use. Usernames and passwords follow the rules in Accounts, sign-in, and security; in short, "Sam" and "sam" are the same username, and a password known from data breaches is refused.
  • Signing in: the username (in any capitals) or the account's email (or one of its confirmed Other Emails, see Settings), and the password. After too many wrong passwords, signing in pauses for a while.
  • Verifying the email: a new account's email gets a link to verify it (it works for 24 hours), and "Account created!" says so. The link opens the login page, signed in or not, which checks it and says whether the email is verified, with Open Spreadsheets & Calendars (signed in on that device) or Sign In next. Connecting spreadsheets or calendars and adding Other Emails need a verified email; nothing else does (see Accounts, sign-in, and security). The link that confirms one of the account's Other Emails (Settings, under Email) opens the login page the same way ("Confirm Your Email").
  • Forgot Password: enter the account's email (or one of its confirmed Other Emails) and a one-time reset link is emailed to that address (it works for an hour).
  • Reset form: the emailed link opens the login page to choose a new password, which signs out every device and turns passkey sign-in off.
  • Sign In With A Passkey: signs in with Face ID, Touch ID, Windows Hello, a fingerprint, or the device's PIN, with no username or password to type (see Passkeys). Browsers with passkey autofill also list the site's passkeys under the username box.
  • The last passkey, tried by itself: the device remembers which of its own passkeys it last signed in with (or made), and as soon as the login page shows, it asks for that one passkey (the face, fingerprint, or PIN), so signing back in is one step, whichever account it's for. It doesn't right after signing out on purpose (Logout, or Sign Out Everywhere in Settings), so someone else can sign in, or after deleting the account; after an automatic sign-out (15 idle minutes, or a session that ended), it does. While it asks, the username and password boxes wait (they can't be typed in, and don't offer the device's saved passwords), so the device's own sign-in help doesn't pop up under the passkey's sheet. Cancelled, or in a browser that only opens a passkey request right in a tap (like Safari, which says no at once otherwise), the boxes come back and the page carries on as usual, with the device's own help, the button, and autofill. A page that opened behind another window tries it again as soon as it's in front. A passkey the account no longer has (or with passkey sign-in turned off) isn't tried again, and one cancelled twice in a row (like one the device doesn't have anymore) waits until that device signs in again, with a passkey or a password.
  • Turn on passkey sign-in: a switch under the password, named for the device (like "(Face ID or Touch ID)" on an iPhone or "(Windows Hello)" on Windows). When it's on, signing in with the password goes to "Turn On Passkey Sign-In?" and makes a passkey for this device right away (Safari only makes one right in a tap, so there it says to press Yes, Turn It On). Off, signing in goes straight to the budget, and nothing about passkeys changes. It doesn't need to be on to sign in with a passkey.
  • The switch and the passkey button only show in browsers that can use passkeys.
  • Signing in keeps you signed in for up to 24 hours, but 15 minutes without activity signs you out. Logout (and the idle sign-out) signs that device out. After a sign-out the site did (15 idle minutes, a session that ended, or Sign Out Everywhere), or a Quick Entry icon that stopped working, the login page says why.

Home

  • Getting Started: a new budget starts at $0, so the first time it opens (on the account's first sign-in, or right after New Budget) a Welcome card at the top walks through three steps: the starting balance (what's in the bank now, after today's purchases so far, and optionally what's in savings), recurring entries (a link to Recurring Entries), and a daily reminder (a link to Settings). Setting the starting balance adds a ⭕️ Transfer titled "Starting Balance" on today (it changes In Bank without counting as a gain), an ordinary entry that can be changed, and makes savings the Savings account's balance today (the default account, or whatever it was renamed to), the same as typing it on Equity (no entry is made, so it isn't counted as a gain). The card only shows that first time: the device the budget first opens on remembers it (prismal_getting_started in the browser's storage, holding the budget's number) until the card goes away, once the starting balance (or any History) and a recurring entry are there or when it's hidden with ×, or until that device signs out. It doesn't come back on a later sign-in, on that device or any other, and it doesn't show on the account's other budgets, or for someone a budget is shared with once it's been set up.
  • Quick Entries To Add: entries made with another device's Quick Entry icon (like a partner's phone, on a budget you share) wait in a card at the top of Home, over the calendar, instead of joining the budget by themselves: each with its type, title, amount, and day (a placeholder's in yellow), and Add (it goes in like a New Entry, and Undo can take it back) and Delete (after asking; it never joins the budget, and the Change Logs keep a note). With two or more, Add All adds them all. Whoever has the budget open can add or delete them, on any device. Until someone taps Add, the icon that added one can still change it or take it back on its Quick Entry page, and the card follows within seconds (Add takes it as it is then). The card goes away once none are waiting. Entries made with this device's own icons are still added by themselves as the budget opens (or, while it's open, within seconds).
  • Home's buttons, in a glass card beside the tabs: Undo at the top left with Redo under it, New Entry (a thin neon ring, its colors running around it from cyan and blue through violet, pink, orange, and gold to green, with a white-hot middle line and a soft glow, around a solid middle that glows like Quick Entry, blue-violet from its center, with a + on it, and its name under it; under the pointer the ring turns red, orange, and gold and glows; in a theme, the ring is the theme's colors) in the middle, and Search (which looks like a search box) at the top right with Quick Entry (which glows) under it.
  • Search (see Search): the Search button opens it, floating over the page.
  • Budget Overview: the four-week calendar in a glass card, under its title and the months it covers (like "October - November 2026"), with the weekdays over its days. Each day is a small glass tile that fades from its top to fully see-through by its middle, so its bottom half is just its edge (its words and sprites aren't see-through); today glows, and a day whose In Bank is below $0 turns red. A zoomed day is solid.
  • Under the calendar: Lowest in bank after today (the lowest In Bank from today through the 28 days after the calendar, red when it's below $0), with, beside it (under it on phones), the 28 days after the calendar: Lowest is on the day In Bank is lowest then, and how low, and Day 28 is In Bank on the 28th day (see the calendar). When any of the card's amounts is below $0, the whole card turns red. Tapping the card (or Enter on it) opens a window of those 28 days, four weeks from Sunday, each with its In Bank to the dollar (the lowest ringed, one below $0 red), and the lowest and Day 28 over them; tapping a day closes it and zooms that day in over the calendar (see the calendar). Under that, side by side on wider screens, Bob (a character who reads your budget and says what to keep in mind, with a new affirmation every day; tapping his card opens his page: see Bob's Page) and Upcoming (entries dated after the calendar; tapping one opens the same options as an entry on a zoomed day: Set to, Add to it, its type and Equity account, Move to, and Delete).
  • Undo and Redo take back calendar changes and quick entries the budget added, newest first, then put them back. They cover New Entry; an entry's Set to, Add to it, Move to, Delete, and Placeholder switch; the bank's Starting Balance; and quick entries. Neither puts a placeholder back on a day that passed (it was deleted with its day, see Placeholders). Each button says what it would do (like "Undo: added Coffee (-$4.50) on 10/05"), and a note says what was undone or redone. On a computer, Ctrl+Z (⌘Z on a Mac) undoes, and Ctrl+Shift+Z (⌘⇧Z) or Ctrl+Y redoes, except while typing in a box or with a box open. Undo never erases anything changed since: if a day it would change was changed some other way in the meantime (like on another device), it says so and lets that step go, and the one before it is next. Each tab remembers its last 25 steps while it's open (going to another page and back keeps them), and signing out forgets them. Every undo and redo is in the Change Logs.
  • Zooming a day: tap a day to zoom in on it, then tap an entry to change its title, its refraction type, its Equity account, or its amount (Set to, or Add to it), move it to another day, or delete it; its options show the entry's whole title. Tapping the day's In Bank sets it to what the bank says (see Entries). Entries never wrap onto a second line: a day that isn't zoomed, and a phone's zoomed day, cut a long one short with "..." at the day's edge (on a computer, a zoomed day lets them run past its edges, over the page). The page dims behind a zoomed day (darker than behind a floating box, and its lines get a dark edge, so they're easy to read). A zoomed day is part of the page: it zooms in on the part of the page on the screen, and from then on the page can be scrolled and pinch-zoomed with two fingers, and the day moves and zooms with the page. On a phone (a touch screen, or a window 760 pixels wide or less), every day zooms to the same size, whatever's in it: 92% of the screen's width (at most 560 pixels), centered, with its text 15 to 19 pixels tall, drawn like every day (today still glowing, and a day below $0 still red). It's as tall as its lines (like History's days), at least about a third as tall as it is wide, centered on the screen; one with more lines than fit starts near the screen's top and runs past its bottom (it never scrolls inside itself), and the page scrolls to the rest of it. It's laid out at that size (its text, sprites, and spacing grow with it) instead of being a tiny day scaled up, so everything in it stays sharp; it only scales while it grows out of the day and shrinks back into it (an unhurried 0.42 seconds growing and 0.32 shrinking). Swiping a zoomed day left or right slides it off the screen as the next day or the day before slides on. On a phone, once a finger has slid a few pixels mostly sideways, the day moves with it, so it's clear a slide is coming (with no day that way, it only gives a little): let go 50 pixels or more from where it started and the slide finishes from there, and let go sooner, or after sliding back, and the day settles back into place. On a computer, the → and ← keys go to the next day or the day before. On a page zoomed in with two fingers, tapping a day zooms the page back out first, then zooms the day, so the day never lands off the screen; a browser that doesn't let a page zoom itself back out (like Safari) keeps the page zoomed, and the day still zooms to the page's own full size, across the page like the rest of it, with its middle where the middle of the screen is, so it's zoomed in with the page (pinching back out shows all of it). On a computer, it doubles in size, as tall as its lines, and when its widest entry would run off the right side of the window, it moves left just enough. In its top right corner are two round glass buttons, 30 pixels across however far it's zoomed: × in the corner zooms back out (so does a tap anywhere outside the day), and + beside it opens New Entry with that day already in its date box (the day stays zoomed, and shows the new entry once it's added).
  • Other ways to look closer: two fingers pinching or stretching on one day zoom (and turn and move) just that day, which settles back when they let go. Two fingers that start on different days (or off the days, or on a zoomed day) zoom the whole page, the browser's own zoom, which stays until it's pinched back. On a computer, holding the mouse button on a day magnifies it, and sliding across days while holding magnifies each one. Home's Help lists these too. History's days zoom and move the same ways.
  • Picking dates: the calendar button next to any date box opens a small calendar to pick a day, starting on the month of the date that's typed (or today's); see Picking a date, above. And while a date box is waiting (the calendar gets a dashed outline), tapping a day on the calendar fills it in.

Recurring Entries, History, Equity, Tracker

Recurring Entries, History, and Equity are tabs on Home and on each other (see The budget's four pages as tabs, above): beside the tabs, a card with the page's icon, its title (Recurring Entries shows its Monthly and Yearly there), and its buttons; under them, the page's table (or History's weeks) in a glass card. The Tracker and Change Logs are in the menu, with their tables in a glass card too.

These pages show their data as tables. Recurring Entries and Tracker have New Entry and Edit buttons: tap a row to change or delete it; Edit shows a ≡ bar to drag rows into order, + Section buttons to add section headings between rows, and checkboxes to delete rows. Equity has only Edit, which adds accounts (New Account), drags them into order, and deletes them. Each page is described in its own section below.

Recurring Entries, Change Logs, and the tracker fit the screen's width, with no sideways scrolling (the tracker's is under The Tracker): on narrower screens, column titles take two lines when they need to (and Recurring's dates break after their day and month, like "10/23/" over "2026"; on wider ones, Recurring's column titles, dates, and frequencies stay on one line), and the title column (Change Logs' action column) takes the room that's left, left-aligned, with a title too long for it cut short with "..." (on screens under 700 pixels wide, where Recurring's dates take two lines anyway, its titles use a second line before they're cut short). Tapping a title that's cut short shows it whole, wrapped, and tapping it again cuts it short (tapping one that's whole, or the rest of the row, opens the row as usual). Change Logs' details scroll in a box about two lines tall, the same as the tracker's aliases: tapping it opens it all the way, and tapping again closes it.

History is laid out like the calendar instead: a week on each row (Sun through Sat), newest on top, where each day shows just its date, big and bold, with its year under it. Tapping a day zooms in on it the same way as on Home (see Zooming a day, above), showing its full date, its In Bank at the end of that day, and its entries. Two fingers and the computer's magnifying work the same way too, and while a Search date box is waiting (History gets a dashed outline), tapping a day fills it in instead.

A zoomed History day has the same round buttons as Home's: + opens New Entry with that day in its date box (adding to a day in History works like New Entry with a History date on Home: History's In Bank lines stay as they are), and × zooms back out.

Changing a History entry: tapping an entry on a zoomed History day opens the same options as on Home (its title, its refraction type and Equity account, Set to, Add to it, Move to, and Delete), with a note saying what a change there does to In Bank. A change to a day before today follows one rule. Typing what the bank says (In Bank on a zoomed day) makes a Catchup entry, and that day's In Bank is then what the bank said, so a change on or before the last Catchup (the latest one on or before today) leaves In Bank as it is on every day, while a change after it, or with no Catchup yet, changes In Bank from its day on. A change to today or a later day always counts, even with a Catchup today. A Catchup's own change takes effect when it's the last one. Days in History keep their In Bank lines, so a change that counts moves them, from its day on; the calendar's days are worked out from their entries, so a change that doesn't count is held off by that day's hold (accountsData.bankHolds), until its week goes into History with the In Bank it had (Upload A Backup's calendar brings the backup's own holds with it). Placeholders coming off days at or before the last Catchup follow the same rule. No Equity account's balance today changes (when the change would move one, that account's starting amount moves the other way to keep it; an account whose interest the change would change starts counting its interest again from that day instead, the same as typing its balance). The tracker and Search count the change (they read the entries). Move to can go to any day from History's first on, even one still to come: moved to a day after today, the entry hasn't happened yet, so the Equity accounts' balances today go without it and follow it on its new day. Moving an entry off any day before today first opens a window saying the "In Bank" amount for any day before the last "Catchup" entry will not be changed, with a ? on what Catchup entries are; Okay goes on with the move. Each change is one step for Undo, and undoing it works out the same way.

Spreadsheets & Calendars

  • Connected Spreadsheets (their own page, Spreadsheets & Calendars, in the menu): each spreadsheet is a button with its name and how many entries it lands from today on (tap it to change it), an On/Off pill switch to its right, and Delete at the very right, with a "Needs a look" box under it when a cell can't be read or a recurring entry keeps one of its entries off. Add Spreadsheet connects another (spreadsheets and calendars, up to 10 together). Connecting one needs a verified email: until the account's email is verified, a note says so (with Send Verification Email) and Add Spreadsheet is off. Under it, a note says spreadsheets shared from another email of yours work once it's added in Settings, under Email (Other Emails), with a link there. See Connected spreadsheets.
  • Connected Calendars (on the same page, under the spreadsheets): each calendar is a button with its name, how many paychecks it lands from today on, and the next one (tap it to change it), its On/Off switch, and Delete, then Paychecks And Shifts and a line on what its last read found, with "Needs a look" under it when something does. Add Calendar connects another, once the email is verified. See Connected calendars.

Settings

  • Reminders: a switch for each kind of reminder (🔔 entry reminders, on to start; ⛔️ In Bank below $0, ✔️ uncommon recurring payments, and ❗️ days with a cost, off to start; accounts that had a reminder on before the switches came keep every kind), the time of day, and the time zone it uses (see Daily reminders). It always shows.
  • Push Notifications: always a Turn On or Turn Off button for this device (with Send Test while it's on). Where push can't work on the device (the server isn't set up for it, the browser can't, an iPhone or iPad not opened from its Home Screen, or notifications are blocked), the status says why, and so does Turn On.
  • Calendar Link: a private link for Google Calendar, Apple Calendar, or other calendar apps; it can be copied, replaced with a new one, or turned off.
  • Theme: how the site looks on this device: a button for each theme (its colors in a swatch, its name, and a few words), and Custom at the end, which opens a window to make one's own (see Themes). Picking one shows it at once, and it's kept on the device, even after signing out.
  • Language And Dates: how to have the browser translate the site, and this device's date format: its own (from its language and region), MM/DD/YYYY, DD/MM/YYYY, or YYYY-MM-DD. It's kept on the device, even after signing out, and works without the server.
  • Sounds: Music and Sound effects switches for this device (both on to start; see Sounds), kept on the device, even after signing out.
  • Reduced Motion: two switches for this device, both off to start: Hold the starfield still (the stars are drawn once and stay where they are) and Turn off other animations (pages appear without sliding, boxes open without zooming, days zoom without easing, and cards don't float). They're kept on the device, even after signing out. A device that asks for reduced motion in its own settings has both on already, and the switches say so (see Reduced motion).
  • Email: add or change it (needs the password). It says whether the email is verified. A new email isn't, until the link it's sent is opened (the old address gets a security notice); until then, Send Verification Email sends a new link. Coming back to Settings after opening the link shows it verified.
  • Other Emails (under Email): other emails of yours, up to 5, each confirmed or waiting (with Send Again), with Remove. Add Email (once the account's email is verified) emails one a link to confirm it. A confirmed one signs in to the account too (with the password, like the account's own email), Forgot Password can send its reset link there, and the spreadsheets its Google account shares with [email protected] can be connected (see Connected spreadsheets). The Spreadsheets & Calendars page's link to add one opens Settings right at Email.
  • Birth Date: the birth date given when signing up (typed, or picked with the calendar button), which can be fixed here if it was typed wrong (18 or older; never younger). An account made before birth dates has only an age, and can add its birth date here.
  • Passkeys (Face ID, Touch ID, Windows Hello): turn passkey sign-in On or Off for the account; see each passkey (its name, when it was added and last used, and whether it's synced) and remove it; or add one for this or another device (needs the password). With no passkeys yet, adding the first one (the Turn On button) is what turns it on. See Passkeys.
  • Password: change it with the current password and the new one (typed twice; at least 8 characters, any characters, not the current one, and not one known from data breaches). It signs out every other device and turns off Quick Entry icons; this device stays signed in, and a security notice is emailed. "Forgot It?" emails a one-time reset link to the account's email instead.
  • Signed-In Devices: how many Quick Entry icons work, with Turn Off Icons (they stop at once; entries already made with them are still added); Show balances on Quick Entry icons, a switch (on to start) that, turned off, has every icon leave out In Bank today, the lowest it gets, and the Equity accounts' balances (it still lists the accounts' names, to pick one), for a phone others might look at; and Sign Out Everywhere, which signs out every device and browser (this one too) and turns off the icons, for a lost phone or a computer that isn't yours.
  • Your Data And Privacy: Download My Data saves everything stored for the account as a JSON file, including when each signed-in device signed in (passwords, keys, session IDs, and private link codes are left out), Upload A Backup brings a budget back from a file Download My Data saved, part by part (see Backups), and Analytics On This Device turns Google Analytics off or on for that device (it's always off in browsers that send Global Privacy Control or Do Not Track).
  • Delete Account: needs the password and a confirmation; it deletes the account and every bit of its data.

Themes

Settings' Theme picks how Prismal Planning looks on the device it's picked on. Each device keeps its own in the browser, even two devices on the same budget, and it stays after signing out (with its Custom theme and its Reduced Motion switches). Tapping Custom brings back the Custom theme the device keeps; tapping it again while it's on opens it to change. It's on every page behind a sign-in and on Quick Entry; the login page, the front page, and the pages for anyone (this one, the Privacy Policy) always look like Prismal. A theme changes the colors, the corners, the background, the stars, the icons, and sometimes the font (themes.css, and the starfield's own stars and colors). New Entry's ring takes the theme's colors (in Prismal's ring's shape), and Quick Entry glows in the theme's colors, its bolt the color of its words.

  • Prismal: the neon starfield, glass cards, and blue-violet glows this page describes.
  • Professional: light and plain: white cards with thin gray edges on a pale blue-gray, dark words in the device's own plain font, small round corners instead of pills, no glows, one blue for what's chosen and what's showing, dark gray icons, and soft gray dots for stars.
  • Dark: Professional, dark: charcoal cards, light gray words, the same blue, light gray icons, and pale dots for stars.
  • Spooky: sharp corners everywhere, a sharper serif font, near-black cards with blood red edges and glows, an ember orange for what's chosen, a moon and red mist behind the page, red icons, and embers and bats for stars.
  • Elements: fire, water, air, and earth, matte: flat earthy cards with no glows or shine, terracotta, teal, pale sky, and moss in the corners of a grainy charcoal, muted icons, and flames, drops, leaves, and gusts for stars.
  • Poison: dark purple glass with purple glows, a toxic green for what's chosen and for links, a green haze rising from the bottom, green icons, and bubbles and spores for stars.
  • Blue: a medium blue: lighter blue glass on blue, white words and icons, pale blue glows, deeper blue recommended buttons, and a warm yellow for what's chosen.
  • Fall: an autumn evening: warm brown glass with cream words, a pumpkin orange glow, maple red for what's chosen, a sunset glowing up from the bottom over a hill with pumpkins on it, warm orange icons, and falling maple leaves (red, orange, gold, and brown), acorns, and pumpkins for stars.
  • Winter: a snowy day, light: white frosted cards with icy blue edges on a pale winter sky, navy words, an icy blue glow, sapphire for what's chosen, snow drifts along the bottom, navy icons, and snowflakes and soft snow for stars.
  • Festive: the holidays: deep pine green glass with gold edges, warm white words, a gold glow, cranberry red recommended buttons and red for what's chosen, a string of colored lights along the top and snow along the bottom, gold icons, and ornaments, holly, snowflakes, gold stars, and candy canes for stars.
  • Floral: pastel and light: blush pink, lavender, and mint, with sprays of flowers in two corners, white cards with pink edges and extra round corners, plum words, a pink glow, lavender for what's chosen, a rounded font on Apple devices (others keep Prismal's), plum icons, and blossoms, petals, and hearts for stars.
  • Digital: blocky: every corner square, a terminal's font (each letter the same width), black glass with green edges and hard pixel shadows, pale green words, a neon green glow, amber for what's chosen, green recommended buttons with dark words, a faint green grid behind the page, dashed lines, a square New Entry with stepped corners, green icons, and green pixels and 0s and 1s for stars.
  • Love: pastel and light: blush pink with hearts in two corners, white cards with rose edges and round corners, deep wine words, a pastel rose glow, red for what's chosen, a rounded font on Apple devices (others keep Prismal's), rose icons, and hearts and petals for stars.
  • Clovers: a dark green night with clovers in two corners, dark green glass, light grey words, a light green glow, pale grey for what's chosen, soft green icons, and clovers (some with four leaves) in light greens and greys for stars.
  • Playful: a bright spring morning: a pale sky with the sun over a green hill with painted eggs, cream cards with extra round corners, deep indigo words, a sky blue glow, pink for what's chosen, a rounded font on Apple devices (others keep Prismal's), indigo icons, and eggs, chicks, and bunnies for stars.
  • Mechanical: a workshop: brushed dark steel with a rivet in each corner of the cards, gears in two corners of the page, small corners, a sturdy font where the device has one, warm grey words, a brass glow, steel for what's chosen, copper icons, and gears and nuts for stars.
  • Custom: one of your own. Its window starts from the theme that's on (or pick another to start from), then has five colors: Background (the page behind the cards), Cards, Words, Glow (today, the page that's showing, recommended buttons, and New Entry's ring), and Chosen (what's picked, like Cost or Gain); then Corners (the theme's, small, or sharp), Font (the theme's, Prismal's, plain, sharp, rounded, or digital), Stars (the theme's, stars, dots, embers and bats, elements, bubbles, leaves, snow, ornaments, flowers, pixels, hearts, clovers, eggs, or gears), and Icons (the theme's, gray, or glowing). Everything else is worked out from those five colors; with light cards, boxes go white. Cards lighter or darker than the starting theme's (light cards on a dark theme, or dark ones on a light theme) take costs, gains, placeholders, and Delete's words in shades made for them, so they stay easy to read, and The theme's icons turn gray, dark or light to suit the cards. It all shows behind the window as it changes: Save Theme keeps it, and Cancel (or ×) puts back the theme that was on.

In every theme, costs stay red, gains green, and placeholders yellow (each in its theme's own shade), so a budget reads the same whatever it looks like.

2. The Starfield Background (And Its Hidden Controls)

Every page of Prismal Planning has a moving starfield behind it: up to 400 small stars (fewer on smaller screens) that drift, twinkle (each one fades out and comes back, now and then with a white spark), and are joined by faint lines, like constellations, when they're near each other. It's only decoration: it never touches the budget, and nothing about it leaves the device.

Moving The Stars With A Pointer Or A Finger

  • Moving the mouse, or dragging a finger, gives the stars near it energy: they're pulled toward it and pushed away from it (harder the faster it moves), so they swirl around it, and a ring follows it.
  • Tapping or clicking anywhere pokes the stars: the ones nearby burst away from that spot, and a ring spreads out from it.
  • A star that drifts off one edge comes back on the other, except right around a moving pointer, where the stars bounce off the edges instead.

Hidden Keyboard Controls

On a computer (or a tablet or phone with a keyboard), these keys move the stars, on any page. Holding a key down keeps it going. They work even while typing in a box (typing a title nudges the stars too), and they never change anything in the budget.

KeysWhat they do
W A S DPush every star up, left, down, or right.
Q E Z XPush them diagonally: up and left, up and right, down and left, or down and right.
Y U I, H J K, B N MMagnets on a 3 × 3 grid of the screen, laid out like the keys: Y is the top left, J the middle, and M the bottom right. The stars are pulled toward that spot and orbit around it.
OThe same magnet, around the pointer.
V and GSlow the stars down, or speed them up.
PTurn every star's drift around, so the whole field flows the other way.
LBreak the constellation lines; they grow back over a few seconds.
R T F CPong: paddles appear on the screen's four edges and move left, right, up, or down, and one star turns into a bright ball that bounces off them. The paddles fade a few seconds after the last press.

The Not Found Page's Starfield Controls

The Not Found (404) page, which shows at any address that doesn't exist, hides a control panel far below its first screen, so the page looks empty until it's scrolled down:

  • Controller: a box for typing the keys above (it empties itself as you go).
  • Readouts: live numbers for how long each frame takes to work out (Misc), the pointer's speed, and the ring and poke timers.
  • Attract (Strength, Radius, and Scale), Clamp, Repel (Strength, Radius, and Scale), and Poke: sliders, each with a number box and − and + buttons (hold one to keep stepping), for how the pointer moves the stars. Attract sets how hard and how far the pointer pulls them in, and Scale how sharply that fades with distance; Repel is the same for pushing them away; Clamp is the stars' top speed; and Poke is how strong a tap's burst is. The settings are saved on that device and used on every page.

Across Pages, And Out Of The Way

  • The same stars carry over from page to page: when a page is left, the stars, where the pointer was, and the slider settings are saved in the browser on that device (constellationStars and constellationMeta), and the next page picks them up, fitted to its screen. Clearing the browser's site data starts a new starfield.
  • It runs in a background thread (a Web Worker drawing on an OffscreenCanvas; a browser without one runs it on the page instead), pauses while the page is hidden or sliding to another page, and shortens its lines on a slow device to stay smooth.
  • It shows right away when a page opens: the background picture is part of the site's stylesheet, so it's there in the page's first frame, and the starfield starts loading (its engine and its star image) the moment a page starts, so the stars are drawn as soon as the page shows instead of blinking in a moment later.

Keyboards And Screen Readers

  • The Tab key goes through each page in the order it reads: first a Skip to the page link (it only shows while it's focused), the header's buttons, the page's tabs, its own controls, then the page. Every control shows where the focus is, in the theme's own color.
  • Calendar days: each day on Home and History is a stop named by its weekday, date, In Bank, and how many entries it has. Enter or Space zooms in on it; the focus goes to the day, the Tab key goes on to its entries, its In Bank, and its + and × buttons, the left and right arrow keys go to the day before and after, and Escape closes it and puts the focus back on the day.
  • Windows are marked as dialogs, say what they are as they open, keep the Tab key inside them, close with Escape, and put the focus back on what opened them.
  • Rows and boxes that open something (Recurring, Tracker, Equity, and Search rows, and a box of aliases cut short) are stops that Enter or Space presses. A set of choices (like Cost or Gain) also moves with the arrow keys, and in Edit, a row's ≡ bar (or a prism's, gem's, or crystal's) moves it with the up and down arrow keys.
  • Screen readers hear each page's main heading, a name for every control, each toast as it comes up, and for a symbol its meaning. The starfield is hidden from them. A line graph can be read a day at a time with the arrow keys (each day is spoken), and its See the numbers opens the same figures as a table.

Reduced Motion (Accessibility)

Settings has a Reduced Motion card for Prismal Planning alone, on that device: Hold the starfield still draws the stars once and leaves them where they are (the pointer, taps, and keys don't move them), and Turn off other animations does everything in the list below but hide the starfield. Prismal Planning also follows the device's own reduced motion setting, which does all of it. Where that is (if it's moved on your version, search Settings for "animations" or "motion"):

iPhone or iPad

Settings > Accessibility > Motion > Reduce Motion.

Samsung Galaxy

Settings > Accessibility > Visibility enhancements > Remove animations (Reduce animations on some versions).

Google Pixel or Motorola

Settings > Accessibility > Color and motion > Remove animations.

OnePlus

Settings > Accessibility (Accessibility & convenience on newer ones) > Remove animations.

Xiaomi, Redmi, or POCO

Settings > Additional settings > Accessibility > Remove animations.

Another Android phone

Settings > Accessibility > Remove animations (on some phones it's under Color and motion, or Visibility enhancements).

A computer

On Windows, Settings > Accessibility > Visual effects > Animation effects (off). On a Mac, System Settings > Accessibility > Display > Reduce motion. On a Chromebook, search Settings for "animations".

With it on:

  • the starfield is hidden and doesn't run at all (nothing is drawn or worked out, which saves battery too);
  • pages appear without sliding, and links go right away;
  • floating boxes (New Entry, Help, Search, and the rest) open and close without zooming, and a day zooms in and out without easing into it;
  • the cards hold still instead of floating;
  • smaller animations are skipped too, like the switches sliding and a connected spreadsheet's form growing in.

Settings' switches change only Prismal Planning, on that device; the device's own setting changes every app and site. With the device's on, both switches show on, and can't be turned off in Prismal Planning.

3. Entries And Refraction Types

An entry is one line of text: an emoji (its "sprite"), an amount, and a title, separated by spaces.

❗️ -$6.50 Coffee
✔️ $1200.00 Paycheck
⭕️ -$100.00 Savings

Costs are negative and gains are positive. Amounts are written like -$1234.56 (no thousands commas). An amount box is typed like a cash register: the digits fill in from the cents, so the decimal point never needs typing (5 is $0.05, 1234 is $12.34, and each digit after moves it along), and phones show their number pad for it. Only dollar amounts are typed that way: a box for any other number that can have decimals (a % amount, an interest rate, and the Paycheck Calculator's hours, multipliers, and percentages) takes it just as it's typed, with its own decimal point, as many decimals as it has (6.125 is 6.125). Its Cost and Gain buttons (or Negative and Positive, for a balance) pick its sign, and typing a − or + flips them. A box whose amount would be $0.00 starts blank, with 0.00 as its hint, and a blank one is $0.00. Tapping into a box with an amount in it selects the amount, so typing replaces it. A pasted amount is read as it is: a $ and thousands commas are fine, and a comma before the last one or two digits is a decimal point, the way phones in many countries write it (4,50 is $4.50, and 1.234,50 is $1234.50). An amount can be up to $1,000,000,000, cost or gain.

Titles are compared without regard to capital letters, extra spaces, or punctuation, so "Coffee", "coffee", and "COFFEE!" are the same title. Titles can be in any language: letters and numbers in any script count, so "Кофе" and "Чай" are two titles, and full-width letters match their plain forms. A title with no letters or numbers at all (like ☕) keeps its symbols, so ☕ and 🍔 are different titles. New titles get each word's first letter capitalized, in any language ("école" becomes "École"). Equity accounts' names follow the same rules. Titles can be up to 100 characters, and account names up to 60.

Refraction Types

An entry's refraction type says how it affects the budget:

TypeEmojiChanges In Bank?In the day's Gains / Costs lines?Counted by the tracker?Example
Regular❗️YesYesYesGroceries, a paycheck
Hidden✖️NoYesYes (always, even for an Equity account)Spending cash
Transfer⭕️YesNoOnly by rows set to count transfersDepositing cash, moving money to savings

A new entry can also be Auto: it takes the type of an entry with the same title already on that day, or Regular if there isn't one.

For a Hidden or Transfer entry for an Equity account, a Transfer changes the account by the opposite of its amount and a Hidden entry by its own amount. In New Entry (on Home and the Quick Entry page) and the recurring entry panel, a small ? next to Refraction Type shows what each type does.

Recurring, Unique, And Temporary Entries

  • Recurring entries (✔️, ✔️✖️, ✔️⭕️) start with a checkmark. They come from the Recurring Entries page and are written onto today and every later day they land on.
  • Unique entries (❗️, ✖️, ⭕️) are ones you add or change yourself.
  • Connected spreadsheets' entries and calendars' paychecks (➕❗️, ➕✖️, ➕⭕️) start with a yellow plus. They come from spreadsheets and calendars connected on the Spreadsheets & Calendars page and are written onto today and every later day of the calendar they're dated on (see Connected spreadsheets). Their temps (❗️➕, ✖️➕, ⭕️➕, the plus second) work just like recurring entries' temps.
  • Temporary recurring entries ("temps": ❗️✔️, ✖️✔️, ⭕️✔️) are unique entries made from a recurring entry, with the checkmark second. A recurring entry becomes a temp when its day passes, or when it's changed on the calendar for that day only. A temp keeps the recurring entry from being written again on its day (for its refraction type). Moving or deleting a recurring entry's day leaves a $0.00 temp behind as a "blocker" for the same reason. Once the recurring entry can't land on a temp's day anymore (its End Date moved before it, or it was deleted), the temp from today on becomes a plain unique entry, and a blocker goes away.

One Entry Per Title And Type, Per Day

A day has at most one entry for each title, Equity account, and refraction type, so a title can appear at most three times on a day: once as Regular, once as Hidden, and once as Transfer. An Equity account after a title makes it a different title here, so "Payday → Savings" and "Payday → HSA" are two entries, and so does the account a transfer comes from ("Move ← Savings → HSA" and "Move ← Cash → HSA"). Whether the amount is a % or dollars doesn't make another entry: a % entry and a dollar entry with the same title, account, and type on one day are one entry (one plain amount, what the two come to), on the calendar, in History, and in Upcoming alike. When New Entry's title, type (Auto matches any), Equity account, and day match an entry already there (a recurring or spreadsheet entry landing there too), the form shows that entry and asks: Add to it (the two amounts are added together; it's picked to start) or Set to this (the entry becomes the new amount). Either way, a recurring or spreadsheet entry becomes a temp for that day (like ❗️✔️), the same as changing it on the calendar. The Quick Entry icon always adds to it. Recurring entries and spreadsheets' entries landing on a day with a matching unique entry are added into it too (it becomes a temp). A spreadsheet's entry with the same title and type as a recurring entry landing that day is left out (the Spreadsheets & Calendars page says so). If matching entries ever end up on the same day another way (like renaming an account to a title already on that day), they're combined the next time the budget refreshes (Upcoming's too).

Changing An Entry

Tapping an entry on a zoomed day (on Home or History, one of Upcoming's under the calendar, one in an Equity account's panel, or a Search result) opens its options, a small box by the entry, which show its whole entry (however long its title), and offer, in this order: its Title, its refraction type and Equity account, Change the amount (Set to a new amount, where a blank box sets it to $0.00, or Add to it) with the amount box, Move to another day (it combines with a matching entry there), Placeholder (for a day from today on, see Placeholders), its title's Needs, Wants, or Future (once that card is on), then Save, Delete, and Cancel, and under them its note (see Notes). If the entry is for an Equity account, its options say so. Its title (its own, before any Equity account) can change on any entry on a day before today, History included, and from today on on any entry that doesn't land by itself: one from a recurring entry or a connected spreadsheet (or a temp of one, like ❗️✔️) keeps its title from today on, since it's changed on the Recurring Entries or Spreadsheets & Calendars page, and its options say so. The lines the budget writes itself (In Bank, Gains, Costs) never have a title to change. A new title keeps the entry as it is (its type, mark, %, and placeholder), unless an entry with the new title and type is already on that day: then the two become one, their amounts added (a placeholder only if both were, and a plain amount). Its Change Log is "✏️ Rename Entry", and Undo takes it back. Its refraction type and Equity account can change too: it then comes off its day the way Delete takes it off (one that landed by itself leaves a $0.00 temp), and goes on as the new one, adding into an entry already on that day with the same title and type (a day has one of each). That's one step for Undo. On a History day, these change the entry without changing In Bank or any Equity account's balance (see Changing a History entry).

Tapping the day's In Bank on a zoomed day asks what the bank says for that day (Negative when the account is below zero). The difference goes on it as a ❗️ Regular entry titled Catchup (added into a Catchup entry already there), so that day's In Bank matches and the days after it follow. It stands for the purchases (or gains) that slipped by, so it counts like they would have: in the day's Gains and Costs, and in the tracker (a new budget's Unknown row counts Catchup). Bob's Refunds leave it out of the purchases they suggest. A day before your last Catchup keeps its In Bank, so tapping In Bank there says so and goes no further (see Changing a History entry).

Notes

Any entry can have a note, as long as it needs to be. At the very bottom of every form that adds or changes an entry (New Entry, an entry's options, the Recurring Entries form, and the Quick Entry icon's form), under its buttons, is Add A Note (or Show Note, when there is one), which opens the note under it; Hide Note closes it again, and the button stays where it is. Save (or Add Entry) saves it with the rest.

  • A day's entry has its own note, a recurring entry or a connected spreadsheet's too, once it lands there. A recurring entry has one of its own too, on its form. A new entry going into one already on that day adds its note after that one's.
  • An entry with a note is underlined wherever it shows: on its day (Home and History), in Upcoming, Search's results, an account's list of entries, and the waiting quick entries (Quick Entries To Add on Home, and Waiting on the Quick Entry page). On Recurring Entries, a recurring entry with a note of its own has its title underlined.
  • A note goes wherever its entry goes: moved to another day, a new title, type, or Equity account (into an entry already there, the two notes are put together), an account renamed, a recurring entry's new title (its days from today on), and from Upcoming onto the calendar and into History. It goes when its entry does: deleted, or a placeholder whose day passed.
  • Undo and Redo put notes back with their entries. A change to only a note is logged in Change Logs ("📝 Entry Note"), and a change that adds, changes, or takes off a note says so in its row (never what it says).
  • They're kept in a table of their own (notes, see How the data is stored), so long notes never fill the rest of the budget: all of a budget's notes together can be about 1.8 MB (around a million characters). One from the Quick Entry icon can be up to 20,000 characters; it waits with its entry, and joins the budget with it.

An entry can go on any day the budget has, from History's oldest day on (for a new budget with no History yet, from the calendar's first day, this week's Sunday), and any later day goes to Upcoming. A day before that has nowhere to hold an entry, so New Entry, Move to, and the Quick Entry icon say so instead of adding it.

Placeholders

A placeholder stands in for an entry you expect but don't know yet, like an estimate for groceries or a bill whose amount isn't out yet. The Placeholder pill switch makes one: in New Entry (on Home and the Quick Entry page), an entry's options, the recurring entry panel (every day it lands on gets one), Quick Entry's prisms, and a connected spreadsheet's panel (every entry it adds). In New Entry and an entry's options, it shows only for a day from today on (the day picked, or Move to's), and in the recurring entry panel, only while the entry can still land (no End Date, or one from today on).

  • It counts like any entry of its refraction type: In Bank, the day's Gains and Costs, the 28 days after the calendar, Lowest in bank after today, Equity accounts' balances (and In 6 Months), the tracker, Search, Bob, reminders, and the Quick Entry icon's balances.
  • Yellow: a placeholder's words are yellow wherever it shows, a cost or a gain: on a day, in Upcoming, Search's results, the Recurring Entries table (its whole row), an account's entries, Quick Entry's prisms and Waiting list, and a connected spreadsheet's count and preview.
  • Deleted once its day passes: as the budget opens (the daily update, the first time on a new day), it deletes every placeholder whose last day is before today, and works In Bank out again from that day on without it. A recurring entry's placeholder lands on each of its days and goes once that day passes, and so does a spreadsheet's. A waiting quick entry that's a placeholder whose last day passed before the budget opened is left out, and a note says so. The daily update's Change Log says how many it deleted ("Placeholders Removed").
  • Its last day: with the switch on, Delete it after (a date box under it, in New Entry on Home and the Quick Entry page, and in an entry's options) picks another last day instead of its own: any day, before its own (it's deleted before it ever happens) or after it (it stays, and counts, past its day). One whose last day has already passed is deleted the next time the budget opens. The recurring entry panel asks instead how many days before or after each day it lands on (Delete each one, a number and days behind the current day or days ahead of the current day, up to 365; blank or 0 is its own day). Behind keeps each one until the current day is that many days past it. Ahead deletes them early, so the current day and the days after it, that many in all, (on the calendar, in the 28 days after it, Search, and the balances ahead) don't have it. One kept past its day can end up in History with its week; when its last day passes, it's deleted there too, and History's In Bank lines from its day on, and the calendar's after them, are worked out again without it. Its options show its last day, and moving it to another day keeps it (a recurring entry's days keep theirs counted from their own day). When two placeholders become one, the one already there keeps its last day.
  • Two entries that become one: when a placeholder and an entry with the same title and type end up on one day (New Entry adding to it, Move to, the Quick Entry icon, or a recurring or spreadsheet entry landing on it), the one entry they become is a placeholder only if both were. Real money is never deleted with a placeholder: a real $30 added into a $100 placeholder makes a real $130 entry.
  • Changing one: an entry's options start with its switch as the entry has it, and turning it on or off changes just that (Undo says "made Coffee on 10/05 a placeholder"). Moved to a day before today, it becomes an ordinary entry unless its last day is still to come, or is a day picked for it (then it's deleted as the budget opens, once that day has passed). The switch hides for a day that passed, unless the entry is a placeholder already. Changing one day of a placeholder recurring or spreadsheet entry makes a temp with its own switch, and deleting one leaves a $0.00 blocker that's a placeholder too, so it goes with its day. Turning a recurring entry's (or a spreadsheet's) switch on or off changes the days it lands on from today on, never the days changed for it.
  • History's entries have no switch (their days have passed), except one that's still a placeholder, kept past its day: it can be made an ordinary entry, or given another last day.

% Amounts

An entry for an Equity account can be a percent of that account's balance instead of an amount, like moving 10% of a credit card's balance into it every payday. When Hidden or Transfer is picked and an Equity account is chosen, the amount box gets a $ / % switch at its left (in New Entry on Home and the Quick Entry page, an entry's options, the recurring entry panel, Quick Entry's prisms, and a connected spreadsheet's typed amount). With %, the box takes the percent as it reads (3 or 12.5, up to 1000), and Cost or Gain picks its sign, like any amount.

  • What it comes to: that percent of what's in the account as its day starts (its balance at the end of the day before, before that day's entries and interest), to the cent. The day shows that amount with the percent after it: ⭕️ -$45.00 (10%) Card → Rewards. A balance below $0 counts by its size (10% of a −$450.00 card is $45.00), and Cost or Gain says which way it goes.
  • Worked out again with every change, from today on (on the calendar, in Upcoming, through six months ahead, and as far ahead as a graph or the Equity window looks), one day after another, so each % entry counts in the balance the next one starts from, along with the account's other entries and interest. Everything that adds up amounts uses what it comes to: In Bank, Gains and Costs, the 28 days after the calendar, Equity accounts' balances and In 6 Months, the tracker, Search, reminders, Bob, and the Quick Entry icon's balances.
  • Once its day passes, it stays what it came to that day: the daily update makes it a plain amount, so History never has one. Days that joined the calendar while you were away work theirs out one day at a time as they're caught up.
  • Two entries that become one (the same title and type on a day: adding to it, Move to, or a recurring or spreadsheet entry landing on it) are one plain amount, what the two come to. Set to with % makes it that percent again.
  • It needs its account: changed to Regular or to no Equity account (or with its account deleted), a % entry keeps what it came to as a plain amount. It can't go on a day that already passed (type the amount there instead), and a Quick Entry icon's % entry for a day that passed before the budget opened is added as the amount the icon worked out.
  • A recurring entry's percent shows in the Recurring Entries table (like -10%), and each day it lands works out its own; its stored amount, which Monthly and Yearly count, is about what it comes to the first time it lands. A connected spreadsheet's amount cell can be a percent too (see Connected spreadsheets).

4. The Calendar And The Budget Math

The calendar always shows four weeks, Sunday through Saturday, starting with the current week. Each day's cell is text:

10/05
✅ $1528.50 In Bank
❇️ $45.00 Gains
✴️ -$6.50 Costs
❗️ -$6.50 Coffee
❗️ $45.00 Sold Lamp
  • The first line is the date, stored as MM/DD and shown in the device's date format (like 10/05 or 05/10).
  • In Bank (✅, or ⛔️ below $0): what will be in the budget's account at the end of that day.
  • Gains (❇️) and Costs (✴️): that day's gains and costs added up, Regular and Hidden (shown only when not $0). Transfers are left out.
  • Then the entries, grouped by kind (unique, temps, hidden, then transfers: your own above the ones from a recurring entry or a connected spreadsheet, changed for the day or not; then recurring, then connected spreadsheets') and in title order within each group.
  • Today is highlighted. A day turns red when its In Bank is below $0.
  • A cost's words are red, a gain's green, and a $0.00 entry's a darker grey (a placeholder's yellow, whatever its amount). In Bank, Gains, and Costs stay light grey.
  • A day that isn't zoomed shows each line only as wide as the day, cut short with "..." when it's longer.

How In Bank Is Worked Out

In Bank is a running total. It starts from the In Bank of the last day in History (the most recent Saturday), or $0 for a new budget. Each day: In Bank = the day before's In Bank + that day's Regular gains − Regular costs + transfers. Hidden entries show in the day's Gains and Costs, but never change In Bank (they happen outside the budget's account). It's worked out again after every change, so it's always up to date.

The 28 Days After The Calendar

The budget looks at the 28 days after the calendar too (recurring entries, connected spreadsheets' entries, and Upcoming entries, but not Hidden ones), and keeps what it finds as two lines in the calendar's last day, right under its In Bank:

  • ✅ $812.40 Lowest: 11/14: the lowest In Bank in those 28 days, and the day it happens.
  • ✅ $1650.00 Day 28 In Bank: In Bank on the 28th day.

Home shows them in the Lowest card instead of on the day ("Lowest is on 11/14: $812.40" and "Day 28 is: $1650.00", each amount red when it's below $0). If the lowest is below $0, its line has ⛔️, and the whole Lowest card turns red (it also does when Lowest in bank after today is below $0). The last day itself only turns red for its own In Bank.

Bob

Bob is the budget's helper. On Home, his card has his everyday message, worked out with every change: a greeting (it changes daily), then what needs attention, then the day's affirmation (each date has its own, the same one every year, with a leap year one on February 29 and a new year's one on December 31). Bob mentions:

  • days on the calendar from today on whose In Bank is below $0;
  • going below $0 in the 28 days after the calendar;
  • uncommon recurring payments (ones that land every 3 months or less often) on the calendar from today on;
  • how many Upcoming entries there are (not $0.00 temps, which only keep a recurring entry off a day; a $0.00 note, like "Add To Savings", counts).

If there's nothing to mention, Bob says everything looks fine. A budget with no recurring entries yet gets a welcome instead of a greeting. Tapping his card (it says "More from Bob") opens his page.

Bob's Page

Bob's page (/menu/bob.html: Menu, then Bob, or tap his card on Home) is where he works out everything heavier than his message, only while the page is open, so the rest of the budget never waits on it. It's a column of cards:

  • Bob's Highlights, at the top with his picture: a line from each card that's on (red-orange when it needs a look), and how many cards are off.
  • Data is always on. Every other card has an on/off switch at its right and starts off (a budget that had goals before the page starts with Goals on). Which cards are on is kept with the budget, so every device, and anyone sharing the budget, sees the same page. A card that's off works nothing out. Turning one on or off is logged in Change Logs ("💡 Bob's Cards").
  • Every card has a ? in a circle after its title that says, in a line or two, what the card is for.
  • What a tap shows (a table or a list) opens in a floating window over the page.
  • Warnings: while a card with a switch is on (every one but Wavelength Planning), a Warnings switch shows before its own (off to start). With it on, whenever that card needs a look (its line in Bob's Highlights is red-orange), Bob's card on Home says so too, a line for each card, and his card moves over the calendar (under Quick Entries To Add, when they wait), tinted red-orange. Okay, under the lines, puts them away and moves his card back beside Upcoming for the rest of the day, on every device; the next day, any that still need a look show again. They're worked out on Home a moment after it draws, so the calendar never waits on them. A card turned off keeps its Warnings switch as it was, but says nothing on Home until it's on again. Turning one on or off, and Okay, are logged in Change Logs ("💡 Bob's Warnings").

Data lists what every card works from, each row with its figure and a note: when History starts (and whether it reaches back the 4 months Payday and Spending Pace need), In Bank today, Lowest in bank after today and its day, Equity (every Equity account today, together, with the Total; it opens the Equity window), the goals (it opens each one's amount, what it's for, and its day), how many titles are on a wavelength (it opens how many are on each one, what Wavelength Planning works from), recurring entries each month (bills and gains, transfers left out, from how often each one lands), paydays (the next one: a payday is a Regular gain from a recurring entry or a connected spreadsheet or calendar, and paychecks fewer than 4 days apart, like two people's, are one payday), what was spent besides recurring bills in the last 7 days and in a usual week, what usually goes out between paychecks, Catchup entries in the last 30 days, big bills in the next 60 days, purchases in the last 30 days (Regular costs added by hand or with the Quick Entry icon, not placeholders), and purchases still to come by the lowest day (what Refunds looks through too). A row with a › opens what's behind it: the accounts, the goals, the wavelengths, the recurring entries with each one's amount a month, each payday with what went out after it, each week of the last 4 months, or the entries themselves. Most of those windows end with a line graph: its date box starts on today, a later day adds what the budget expects (drawn dashed), a name in its legend hides or shows that line, and See the numbers lists the same figures.

The Equity window (Data's Equity row, or Search's Go To Equity) is a table of In Bank, each Equity account, and the Total (In Bank and every Equity account together): what each holds now (with its Max after it, when it has one), and what it will hold at the end of the day in the box at the top of the third column, counting everything planned until then (the calendar's days as they are, then Upcoming, recurring entries, and connected spreadsheets' entries, the way the daily update will fill those days in, and interest). The day can be tomorrow through 10 years ahead, typed or picked with its calendar button. It starts 6 months ahead, and the device remembers the one picked (prismal_bob_accounts_day, kept after signing out). When an account has interest, an Interest column shows what each one gets from today through that day (below $0 is interest paid, like a credit card's) with its yearly rate and, on a line under the account, how it's worked out. A graph of all of it is at the bottom.

Goals

Bob's Goals card sets amounts for In Bank, the Total, or an Equity account to reach. New Goal asks what it's for (each with what it holds now; Savings is picked to start), its amount, and if you like, a title of its own and a day to reach it by. The amount can be a % of what it's for instead (the $ / % switch): that percent of what it holds the day the goal is set, which then stays the goal's amount (the goal shows the percent "when set" too). A credit card's goal can be $0.00 (paid off), or any amount above what it holds.

  • Each goal shows its title (or what it's for), what that holds now and the goal's amount, and its day ("Savings: $500.00 of $2000.00 by 12/31/2027"), with a thin bar for how far along it is. How far along counts from what it held when the goal was set, so a card climbing from -$2000.00 to $0.00 shows how much is paid off.
  • Reached once it holds the amount. With a day: On track when the budget as it stands gets it there by then; otherwise how short it is on that day, and what to set aside from each payday until then (for an Equity account; for one below $0, paying more toward it), or how much less to spend from each (for In Bank or the Total), and about how much that is a month. For an account with interest, Bob works the interest out again with the extra in it (a card paid down faster pays less interest), so the amount is the least that gets there, to the cent. Bob adds that it's helpful to put those payments in as a recurring entry, so the budget counts them.
  • In danger when setting that aside would take In Bank below $0 on a day before then (the money comes out of In Bank), when spending that much less is more than usually goes out between paychecks besides bills (from Data), when no paycheck lands before its day, or when its day passed ("Missed").
  • Without a day: when the budget as it stands gets it there (looking up to 10 years ahead), or when it doesn't, what setting aside from each payday would get it there in a year (with the same tip about a recurring entry).
  • Tapping one changes it or deletes it. A % goal keeps its amount unless its percent or what it's for changes. Up to 20 goals. A goal set before goals needed what they're for asks for one the next time it's changed.
  • Renaming an account keeps its goals with it, and a goal for an account that was deleted says so. Goals are logged in Change Logs ("🎯 New Goal", "🎯 Change Goal", "🎯 Delete Goal").

Wavelength Planning

Each title can be on a wavelength, what its money is for, or on None. A budget has 1 to 10 wavelengths, named as you like, in order from the longest to the shortest; they start as Needs (like rent, groceries, and bills), Wants (like eating out and fun), and Future (like savings, or paying down a card), and those are only where they start: no share of your money is expected of any of them. Once Bob's Wavelength Planning card is on, every form that adds or changes an entry asks at its bottom (Wavelength), with a button for each wavelength and None: New Entry, an entry's options (on a zoomed day on Home or in History, in Upcoming, in Search's results, and in an account's Entries), the Recurring Entries page's form, and the Quick Entry icon's form.

  • It's kept for the title (compared the way the tracker compares titles: "Groceries → Cash" is Groceries), so every entry with that title shares it, past and future. The form starts on the title's wavelength and follows the title as it's typed, until one is tapped, and changing it on one entry changes it for the title. The Quick Entry icon can't see which titles have which, so its form starts with none picked, which leaves the title's as it is; one that's picked is given to the title when the entry joins the budget (unless that wavelength was taken out by then).
  • Wavelengths (the card's button) opens them in order, each with its color, its name (up to 30 characters, each name once), ↑ and ↓ to move it, and × to take it out (after asking, when titles are on it, which then have none); Add A Wavelength adds one, up to 10, and Save keeps them. The first is the longest wavelength and the last the shortest, so their colors run from red through orange, yellow, green, and blue to violet, like light. Every entry form's buttons follow them. Renaming one keeps its titles on it. Back to just Needs, Wants, and Future, the budget stores nothing for them again. Saving them is logged in Change Logs ("🌈 Wavelengths").
  • Turning the card off hides the question everywhere and keeps what each title has. Up to 2,000 titles can have one. A change to only a title's wavelength is logged in Change Logs ("🏷️ Entry Wavelength"), and a change to an entry that changes its title's wavelength says so in its own row.
  • The card's spectrum adds up what each wavelength's titles cost between its From and To days (the last 30 days to start): History's days, the calendar's, and after the calendar the way the budget fills those days in (Upcoming, recurring entries, and connected spreadsheets' entries, up to two years ahead). A title counts by what its entries come to together, so a refund takes off what it cost, and a title whose entries come to a gain isn't in it. Placeholders count; $0.00 entries don't.
  • It's one glowing bar with a wave running along it, long at the left and shorter and shorter toward the right, like light's spectrum. Each wavelength with something in it gets a stretch of the bar as wide as its share, in the wavelengths' order and its own color. Under the bar, what was spent on a wavelength in those days, or, pointing at a stretch (or moving to it with the keyboard), its amount and share. Under that, each wavelength's name, amount, and share. Tapping a stretch or a name opens its window: the days (changing them there changes the card's too), what it came to and its share, and each of its titles, biggest first, with what it cost, its share of the wavelength, and how many entries it has, in a box that scrolls.
  • What the costs on no wavelength yet come to shows under it; tapping it opens those titles ("Not On A Wavelength Yet"), biggest first, each with a button for each wavelength that puts it on one right there.
  • Each wavelength is always named in words beside its amount, so its color never has to say which it is.

Bob's Tips

Each of Bob's tips is a card of its own on his page, with its own switch, worked out each time the page draws:

  • Payday: on a day with a paycheck (a Regular gain from a recurring entry or a connected spreadsheet or calendar), "Hey, you just got paid! Keep in mind, besides your recurring bills, you tend to spend about $X in the next N days, so be careful what you spend it on!" N is the days until the next payday, at least 4 days away (14 if there isn't one). On any other day it says when the next payday is, and about how much usually goes out from one payday to the next (N is then the days from the next payday to the one after it). $X is the average of what went out of In Bank in the N days after each payday in the last 4 months, besides recurring bills (Regular costs that didn't come from a recurring entry or a connected spreadsheet or calendar). It needs History to reach back 4 months. See paydays opens each one.
  • Spending Pace: what went out in the last 7 days (today too) besides recurring bills, next to a usual week (the 4 months before them, averaged). When the last 7 days are at least $50 and 25% over, Bob says how much was spent and how much more than usual that is, and suggests taking it easy for a few days. It also needs 4 months of History.
  • Big Bills: the big uncommon bills in the next 60 days: a recurring cost of $200 or more that lands every 3 months or less often, a connected spreadsheet's cost of $200 or more with no other one like it (same title and type) within 90 days, or a one-time cost of $200 or more added for a later day, on the calendar or in Upcoming, never a transfer. A bill that a recurring entry lands more often than every 3 months, like rent every month, is never one, not even on a day it was changed for, or added by hand with that recurring entry's title and type. Bob names the soonest one (and how many more there are), says to make sure you're saving enough to afford it, and how much to set aside from each paycheck until then (the bill divided by the paychecks before it, today's too, rounded up to a dollar); if it lands before the next paycheck, to check that what's there now covers it.
  • Weekly Check: on Sundays, to compare today's In Bank with the real bank account, find the purchases that make up any difference and add them (on the day they happened, or just today), and for anything that can't be found, tap today's In Bank on Home and type what the bank says, "and I'll add a Catchup entry to make up the difference." On other days it says when the next check is.
  • Catchup Entries: what entries titled Catchup (or Catch Up), Regular or Transfer, cost in the last 30 days. At $100 or more, Bob says purchases are slipping by and suggests adding each one as it happens, with the Quick Entry icon.
  • Refunds: when Lowest in bank after today is below $0, "Hey, Lowest in bank after today goes to (that amount) on (that day). Is a refund possible?", with up to 5 purchases (Regular costs added by hand or with the Quick Entry icon, not placeholders) from the last 30 days, or still to come by that day, that would help: first any that would cover it by itself (the smallest of those first), then the biggest others.

Upcoming (Future Dates)

An entry dated after the calendar waits in Upcoming, in date order. When its day joins the calendar, it moves onto that day (combining with a matching entry there). The 28-day lines and Lowest in bank after today count Upcoming entries. Tapping one in Home's Upcoming list opens its options, like an entry on a zoomed day.

Dates, Time Zones, And Formats

  • Stored the same way everywhere: a day is stored as text, MM/DD/YYYY (MM/DD on a calendar day's first line, YYYY-MM-DD for the API), never as a moment in time, and read back as that same calendar day in whatever time zone the device is in. Changing the device's language, region, date format, or time zone never moves an entry to another day.
  • Shown and typed in the device's format: its own (from its language and region: MM/DD/YYYY in the US, DD/MM/YYYY in most of the world, YYYY-MM-DD in some places), or the one picked in Settings, Language And Dates (kept on that device). Typed dates are read the same way, with /, ., -, or spaces between the numbers, or as digits alone, since a phone's number pad has no / or - (10052026, 100526, or 1005 for 10/05; 20261005 where the year comes first). A year first (2026-10-05) always works, a missing year is the nearest one, a 2-digit year is in the 2000s (in a birth date, the latest year it can be, so 90 is 1990), and a day that doesn't exist (like 31/02) is refused instead of rolling over. Month names work too, in English, either way around and with or without a year or a weekday (Oct 5, 5 October 2026, Mon, Oct 5, 2026), and read the same in every browser. Change Logs are written in the format in use at the time.
  • Today is the device's date. Days are counted on the calendar, never in 24-hour steps, so daylight saving time can't skip or repeat one.
  • The budget's day never goes back: if the device's date is before the last day the budget was brought up to date (after flying west across midnight, with the clock set back, or after another device that's a day ahead opened it), the budget keeps using that later day until the device catches up. Otherwise the calendar could be laid out on the week before, with every day's entries on the wrong day.
  • A page left open past midnight, or on a device that moved to another time zone, reloads when it's next brought into view or used (unless it has a change it couldn't save yet), so the daily update runs first. Reminders follow the device's current time zone, which is sent with every reminder plan.

5. Recurring Entries

Each recurring entry has a title, a refraction type (shown as ✔️ Regular, ✔️✖️ Hidden, or ✔️⭕️ Transfer), an amount, a frequency, a Start Date, and an optional End Date. Its panel (New Entry or a tapped row, on the Recurring Entries page) asks for them in this order: Title, Refraction Type (Regular to start), Equity account (for Hidden or Transfer), From (for a Transfer with an account picked), Amount, Frequency, Start Date (today to start), End Date, and Placeholder (and, while it's on, how many days before or after each day it lands on to delete it), then Add Entry (or Save, Delete) and Cancel. Hidden and Transfer ones can be for an Equity account, like a transfer into Savings every payday, and then their amount can be a percent of the account's balance instead, worked out for each day they land (see % amounts). A Transfer can come from another Equity account instead of In Bank, like moving money from Savings into an HSA every month (see From another account).

Frequency: Every N Days, Weeks, Or Months

  • Frequency is a whole number from 1 to 999 and a unit: Days, Weeks, or Months. It's stored and shown like "Every Day", "Every 2 Weeks", "Every Month", or "Every 12 Months".
  • It counts from the Start Date. Every 2 weeks lands on the Start Date, then every 14 days. Every 6 days lands every 6th day.
  • Months land on the Start Date's day of the month, or the month's last day when the month is shorter: an entry starting on the 31st lands on the 30th in 30-day months and on February 28 (29 in leap years). Every 12 months is once a year.
  • It never lands before its Start Date or after its End Date. No End Date means it keeps going.
  • Older names still work: Weekly, Biweekly, Monthly, 3 Month, 6 Month, and Yearly are every 1 week, 2 weeks, 1 month, 3 months, 6 months, and 12 months, and get rewritten that way. Semi-Monthly (the 1st and the 15th) has no every-N version, so entries that already have it keep landing on the 1st and 15th. For something new on the 1st and 15th, make two monthly entries with different titles, like "Paycheck 1st" and "Paycheck 15th".
  • Uncommon recurring entries are ones that land every 3 months or less often (every 3+ months, 13+ weeks, or 90+ days). Bob and the daily reminders point them out.

One Per Title, Type, And Equity account

Two recurring entries can have the same title only when their refraction type or Equity account is different. So Payday can be a Regular, a Hidden, and a Transfer recurring entry at once, and "Payday → Savings" and "Payday → HSA" are two different ones (as is a plain Payday Transfer next to them), but there can't be two Transfers called "Payday → Savings" (one that comes from another account, like "Payday ← Cash → Savings", is another one). This keeps it clear which recurring entry a day's entry came from.

  • Adding one, or changing one's title, type, or account, so it matches another in all three is refused with a message naming that one, so the existing one gets changed instead.
  • Renaming an Equity account renames its recurring entries too, so a rename that would make two match (like one still named for a deleted account with the new name) is refused, saying which.
  • If a budget has two that match anyway, the Recurring Entries page lists them under "Needs a look" until one is changed or deleted, and on a day both land on, only the first one in the list does.

On The Calendar

  • Recurring entries are written onto today and every later day of the calendar they land on. Their amount counts in In Bank like any entry of their type.
  • Once a day passes, its recurring entries become temps (❗️✔️ and so on), so later changes to a recurring entry never change days that already happened.
  • Changing a recurring entry on the calendar changes only that day (it becomes a temp). Moving or deleting it leaves a $0.00 blocker on its day.
  • Changing a recurring entry's title or refraction type takes those changed days along: from today on, its temps and $0.00 blockers (on the calendar and in Upcoming) get the new title and type, so a changed day keeps its amount and a deleted day stays deleted. Days that passed keep theirs.
  • Moving a recurring entry's End Date earlier lets go of the days after it: from today on, its temps there (on the calendar and in Upcoming) become plain unique entries and its $0.00 blockers go away, since there's nothing left for them to hold back. (If the End Date moves later again, the recurring entry lands on those days again and adds into a matching unique entry there, like on any day.)
  • Deleting a recurring entry ends it yesterday: it stops from today on, its temps from today on become plain unique entries (and its blockers go away), and days that passed keep theirs.
  • With Placeholder on (in its panel), it lands as a placeholder on each of its days, in yellow, and each one is deleted once its day passes, so it never leaves a temp behind (see Placeholders). The switch shows while it can still land: with no End Date, or one from today on.

Monthly And Yearly

The top of the Recurring Entries page shows (each on one line, so a minus sign stays with its amount):

  • Monthly: about how much the recurring costs add up to each month (every 2 weeks counts as about 2.17 times a month, every week about 4.35, every 3 months a third).
  • Yearly: what was spent so far this year (costs on past days and today), plus every recurring cost still to land from tomorrow through December 31.

Neither counts gains or transfers (transferred money is still yours). Hidden costs count, like any cost.

6. Connected Spreadsheets

A spreadsheet you already keep, like a list of bills, paychecks, or a shift schedule, can be connected on the Spreadsheets & Calendars page (in the menu). Its entries then land on your calendar by themselves, from today on, like recurring entries, behind a yellow plus: ➕❗️ Regular, ➕✖️ Hidden, or ➕⭕️ Transfer. When the spreadsheet changes (an amount, a date, a new row, a deleted row), the calendar follows it. The Spreadsheets & Calendars page's Help explains it in short.

Sharing It

  • A verified email first: connecting (and reading) spreadsheets needs the account's email to be verified, with the link emailed when the account was made or Send Verification Email (on the Spreadsheets & Calendars page, or in Settings under Email). Until then, the Spreadsheets & Calendars page says so and Add Spreadsheet is off, and a spreadsheet that's already connected (like after the email changed) keeps its last entries and says to verify the email.
  • Anyone with the link (Viewer): works for Google Sheets (its sharing link, or a File > Share > Publish to web link), files in Google Drive (like an Excel file kept there), Excel in OneDrive or SharePoint, and Dropbox. Anyone who has a public link can see the whole spreadsheet, so the link's ? suggests a separate spreadsheet with only what Prismal Planning needs, filled from the main one (in Google Sheets, =IMPORTRANGE("main spreadsheet's link", "Bills!A2:C50") brings those cells over and keeps them up to date).
  • Shared with [email protected] (Viewer): for Google Sheets and Google Drive files, nothing has to be public. Prismal Planning's Google account reads it for the Prismal Planning account whose verified email, or one of its confirmed Other Emails, is the email of the Google account that owns the spreadsheet or shared it with [email protected], and for no one else. Gmail addresses match with or without dots, and without anything after a +, the way Gmail delivers them. (This uses the server's Google sign-in for that account, set up once; see Notes for developers. Without it, only links anyone can open work.)
  • Other Emails: spreadsheets kept in a Google account with another email than the Prismal Planning account's can be shared with [email protected] too. Add that email under Other Emails in Settings (under Email; the Spreadsheets & Calendars page links there), and we email it a link that works for 24 hours (Send Again sends a new one, and the one before stops working). Once it's opened (the login page checks it, signed in or not), the spreadsheets that email shares count as the account's, and the email signs in to the account too (with the password). Up to 5 per account. Removing one stops its spreadsheets from being read for the account (and it stops signing in), and one that's never confirmed goes away when its link runs out.
  • Apple Numbers doesn't share a spreadsheet in a way another site can read, so its links say to keep the spreadsheet in Google Sheets or Excel instead (in Numbers, File > Export To > Excel). Older Excel files (.xls) are asked to be saved as .xlsx.
  • The server downloads the file from where it's kept and passes it straight to the page, without keeping it. Microsoft doesn't say how a sharing link downloads, so for OneDrive and SharePoint links the server tries the known ways in turn.

Adding One

  1. Add Spreadsheet opens a box that asks for the link. Open Spreadsheet downloads it, says what it found (its name, how many tabs, and how it's shared), and the box grows into the entry form, named after the file (the name can be changed).
  2. Each part of an entry has a yellow ➕ to the left of its box: Date, Title, Amount, Refraction Type, and Equity account (which shows for Hidden or Transfer, or when the type or the account comes from cells). Tapping ➕ opens a second box over the first: the tab (a box to type its name, with the spreadsheet's tabs under it to tap, hidden ones too) and the cells, typed as columns and rows: From Column B Row 2 To Column B Row 50, which is B2:B50. The "To" boxes are optional (just one cell), a column can be letters or its number (2 is B), and typing B2:B50 into the first box fills all four. As it's typed, the box shows the range and what's in it ("= Bills!B2:B50: 49 cells, like Rent, Phone, Internet"). Use These Cells puts the range where the part's box was ("Bills · B2:B50"; tap it to change it), and the ➕ fills in. Type It Instead goes back to typing.
  3. Only the dates have to come from the spreadsheet. The title, amount (with Cost or Gain), refraction type, and Equity account can come from cells, or be typed (or picked) once for every entry. A part from cells needs as many cells as the dates, or just one cell, which then goes with every entry.
  4. Each date cell makes one entry, with the cells in the same spot of the other parts (cells are read row by row, left to right). Empty date cells are skipped, so picking more rows than are used now picks up rows added later.
  5. Under the parts, Entries shows what it finds from today on (the first 8, and how many), and Needs a look lists anything it can't read. Save Spreadsheet connects it. With nothing to add and something that needs a look, it says to fix that first.

How Cells Are Read

  • Dates: date cells are dates (whatever format they show in). A number in a date column is a date's serial number (a date without a date format). Text is read like a typed date (except digits alone, which a cell holds as a number): the device's date order, YYYY-MM-DD, or month names like "Oct 20, 2026" or "20 October" (a weekday in front is fine, and a missing year is the nearest one). A cell that isn't a date is listed under Needs a look.
  • Amounts: number cells as they are; text with a currency sign or code, thousands separators, a minus before or after, or accountants' parentheses (($45.50) is a cost). As Written reads a minus as a cost and anything else as a gain; most bill lists write costs without a minus, so All Costs makes every one a cost (and All Gains every one a gain). A cell that's a percent (3%, or a number formatted as a percent) makes a % entry, a percent of its Equity account's balance, so its entry needs an Equity account; a typed amount can be a percent the same way, with the $ / % switch, once an account is picked.
  • Refraction types: Regular, Hidden, or Transfer (any capitals, or just R, H, or T, or the emoji); an empty cell is Regular.
  • Equity: the account's name (any capitals); an empty cell is none. The entry keeps its title, with the account after it ("Payday → Savings", or "→ Savings" with no title), so it changes that account like any entry for it (a Transfer by the opposite of its amount, a Hidden entry by its own). It has to be one of your Equity accounts, and the entry has to be Hidden or Transfer.
  • Titles get each word's first letter capitalized, like any entry, up to 100 characters. Formulas count as what they show, and text with formatting in it reads as plain text.

On The Calendar

  • Its entries are written onto today and every later day of the calendar (never days before today), and taken off and written again with every change, from the spreadsheet as it was last read. Entries with the same title and type on the same day are one entry, their amounts added.
  • They work like recurring entries: a unique entry with the same title and type on that day takes in the amount (it becomes a temp, like ❗️➕); changing one for its day (Set to, Add to it, Move to) makes a temp that keeps the spreadsheet's entry off that day even when the spreadsheet changes; deleting one leaves a $0.00 temp; and Undo works on them like any calendar change.
  • An entry with the same title and refraction type as a recurring entry that lands the same day is left out (a day has one of each), and the spreadsheet's box on the Spreadsheets & Calendars page names it.
  • Once a day passes, its spreadsheet entries become temps, so they stay as they were, even if the spreadsheet changes later or is deleted.
  • Placeholder (a pill switch in its panel, under its parts): every entry it adds is a placeholder, in yellow, deleted once its day passes instead of becoming a temp (see Placeholders). Its button on the Spreadsheets & Calendars page then counts "placeholders from today on", in yellow.
  • They count everywhere the budget looks ahead: In Bank, Lowest in bank after today and the 28 days after the calendar, Search (past the calendar too), the daily reminders, Equity accounts' balances, and Bob's page (Payday counts their Regular gains as paychecks, Spending Pace leaves their costs out like recurring bills, Big Bills counts a big one with no other like it within 90 days, and Accounts and Goals count them ahead). Like recurring entries, they aren't listed in Upcoming.

Staying Up To Date

  • Every spreadsheet that's on is read again when Home opens (at most every minute and a half each, on that device) or comes back into view, and every time the Spreadsheets & Calendars page opens. The budget only changes when something in a spreadsheet did, and the change is logged as "➕ Spreadsheet Update" (with no Undo: the next read would only bring it back). A read that started before the spreadsheet was changed is left out.
  • A row the spreadsheet drops comes off the calendar from today on. A day changed for it becomes a plain unique entry (a $0.00 one goes away), since there's nothing left for it to hold back.
  • If a spreadsheet can't be read (sharing turned off, say, or the account's email isn't verified), its last entries stay, and its box says why. A dropped connection isn't shown; it's just read again next time.

On, Off, And Delete

  • Off takes its entries off the calendar (and it isn't read) until it's turned back On, which reads it again right away. Days changed for it keep their changes.
  • Delete takes its entries off from today on; days changed for it become plain unique entries, its $0.00 temps go away, and days that passed keep theirs. The spreadsheet itself is never touched.

Needs A Look

Each problem names its cell (like Bills!A5) and says how to fix it: a date or amount that can't be read, an amount over $1,000,000,000, a refraction type that isn't one, an Equity account you don't have (add it on the Equity page, or fix the cell), an account on a Regular entry, a percent with no Equity account, a missing tab, parts whose cells aren't the same size as the dates, or a spreadsheet that isn't shared or is too big. A cell's problem only leaves out its own entry; the first 6 are listed, then how many more. A recurring entry keeping one off is listed too.

Files And Limits

  • Files: .xlsx (Excel; Google Sheets downloads as one, which keeps real dates), .ods (LibreOffice and others), and .csv (comma, tab, or semicolon separated). The browser reads them itself (the zip inside an .xlsx or .ods is opened with the browser's own DecompressionStream), so a browser from before 2023 can't.
  • Up to 10 spreadsheets, 8 MB each, and 5,000 cells for each part. Entries are kept from 100 days before today (Bob's Big Bills card looks for ones like them) to 800 days after, up to 3,000 each, and only today's and later ones land.

7. Connected Calendars

A calendar with your work shifts on it (Apple's iCloud, Google Calendar, Outlook, or a work scheduling app that shares one) can be connected on the Spreadsheets & Calendars page (in the menu), with your pay. Each paycheck its shifts come to then lands on your calendar on its payday, behind a yellow plus like a connected spreadsheet's entry (➕❗️ Regular, or ➕✖️ or ➕⭕️ with an Equity account), at what it comes to after deductions and taxes, and as shifts are added, moved, or deleted, the paychecks follow. Pay is worked out the way payroll does it: hours by workweek, overtime on the regular rate, night pay, pay by event title, bonuses, deductions, and withholding. The page's Help explains it in short.

Connecting One

  1. A verified email first, like for a spreadsheet: until then, Add Calendar is off and a note says so.
  2. The calendar's subscription link (an iCalendar feed, the .ics kind): Apple's iCloud (in the Calendar app, the calendar's i, Public Calendar, then Share Link; it starts with webcal://), Google Calendar (Settings, the calendar, then Secret address in iCal format), Outlook (Settings, Calendar, Shared calendars, then Publish a calendar's ICS link), or a work scheduling app's calendar link. webcal:// and http:// links are read as https://. The link's ? says where each app keeps it. Anyone with such a link can see that calendar's events, so a calendar with just your shifts keeps the rest of your days private.
  3. Add Calendar asks for the link, and Open Calendar reads it (its name, from the calendar, and how many events it has). The box grows into the form, named after the calendar.
  4. Its Paychecks: Paychecks' title (blank: Paycheck), Refraction Type, Equity account (for Hidden and Transfer), and Placeholder (every paycheck a placeholder, since one worked out ahead is an estimate).
  5. Pay: First paycheck (the first payday to count) and everything below. Fill in from a crystal puts in the boxes a Paycheck Calculator crystal keeps (base pay, the multipliers, allowances, deductions, FICA, the federal and state percentages, and reimbursements; the hours come from the calendar).
  6. Under the form, what it finds: the paychecks from today on (the first 6, with their hours), the day counting starts, and Needs a look. Save Calendar connects it. When something keeps every paycheck off (no first paycheck or base pay, or an Equity account that doesn't work), it says to fix that first.

Shifts

  • Every event with a time is a shift; all-day events aren't (except bonuses). Only events with (words, with commas between them) keeps just the events whose titles have one of them, and Leave out events with drops the ones that have one. Titles match in any capitals.
  • Events that overlap are one shift, so time is never counted twice: from the first start to the last end, titled with their titles joined by +.
  • Repeating events count each time they land (daily, weekly, monthly, and yearly repeats, with the days taken out of them, and a single time moved or canceled). A repeat made another way (like by week number) counts only its first time, and Needs a look names it. A time in another time zone is read in its own and counted in this device's.
  • A shift past midnight counts on the day it starts, and one over 24 hours is a 24-hour piece on each day from its start, so each piece can be in a different workweek and paycheck. Or it Is split at midnight, each day's hours on that day.
  • Unpaid break: minutes taken out of each shift of so many hours or more, spread across all of it. A title rule can have its own.

Paydays And Pay Periods

  • How often: every week (on a weekday), every other week (lined up with One of its paydays, or with the first paycheck), twice a month (on two days of the month), or once a month. A day past a month's end is that month's last day.
  • A payday on a weekend is paid that day, the Friday before, or the Monday after.
  • Each paycheck pays its pay period: the full workweeks that ended before the week its payday is in (since the paycheck before it), or the days up to a number of days before its payday. Pay periods follow one another with no gaps or overlaps.
  • Look ahead (days, weeks, or months; 21 days to start, or when it's blank): paychecks paid further past today aren't added yet, since a schedule that far out may not be done. Their shifts still show. A paycheck with no hours (and no bonus) isn't added.

Pay

  • Base pay, and Night pay for base pay's hours within the Night hours (from and to, like 10:00 PM to 6:00 AM; blank: no night hours).
  • Pay By Event Title: a shift whose title has a rule's words in it is paid that rule's way (the first rule that matches): its hourly rate (blank: base pay), its night rate in the night hours (blank: its hourly rate), plus an extra per hour, times a multiplier; an extra per shift (a stipend, taxed like pay or tax-free like a per diem); its own unpaid break; or as paid time off (paid at its rate, but not counted toward overtime, like vacation). A rule can start and end on days you pick. Each rule opens and closes, its summary saying what it pays.
  • Premium word: a shift with it in its title is paid base pay times the premium multiplier (like a holiday). Its hours count toward overtime's limits, but they're never overtime too.
  • Bonuses: an all-day event with the bonus word (bonus, to start) and an amount, like Bonus $25, is paid in the paycheck for its week, and counts in that week's overtime rate.
  • Taxable allowances: added to each paycheck with hours.

Overtime

  • Hours count within each workweek (it starts on the day you pick) in the order they're worked. Hours past Overtime after (40 hours a week, to start; 0 for none) are overtime: the week's last hours.
  • For places with daily limits: a day's hours past its daily limit are overtime, and past the double time limit, double time (at its own multiplier). Hours within the day's limit count toward the week's.
  • Overtime is paid on the week's blended rate (the week's pay for hours worked, its bonuses, and its taxable per-shift extras, over its hours: the regular rate of pay the law uses), each overtime hour getting its own pay plus the multiplier, less one, times that rate; or on each hour's own rate, times the multiplier.

Deductions And Taxes

  • Pre-tax medical and retirement (a percent of gross and a fixed amount each paycheck), post-tax deductions, and non-taxable reimbursements (with tax-free per-shift extras) work like the Paycheck Calculator's.
  • FICA: Social Security and Medicare (Medicare is 1.45% of FICA's percent, Social Security the rest), each worked out and rounded on its own, on gross pay less pre-tax medical (a retirement plan still pays FICA). Social Security stops for the year once the calendar's paychecks that year reach its wage base ($184,500 in 2026), and Medicare adds 0.9% on the year's pay past $200,000, the way payroll withholds them.
  • Federal: a percentage of the pay after pre-tax deductions; or From my W-4 (filing status, the Step 2 box, Step 3's dependents, and Steps 4(a), 4(b), and 4(c)), worked out with the IRS's percentage method for automated payroll (Publication 15-T's 2026 tables; a year without its own uses the closest), with bonuses at the 22% supplemental rate on their share of the pay; or none.
  • State: a percentage; any state or DC, worked out the way withholding does from a year's pay: its 2026 standard deduction, exemptions, brackets, and credits, with single or married and its dependents or allowances (Oklahoma from its own withholding tables, rounded to the dollar as its packet says; Arizona from the share picked on its Form A-4; Alabama and Oregon take the year's federal tax off the pay first; Utah's credit shrinks as pay grows; the nine states with no tax on pay say so in the list); or none. A City or county tax (a percentage, like Pennsylvania's local earned income tax) is added to it. Retirement comes out before state tax unless you say it doesn't (some paystubs take state tax on the pay before retirement).
  • Overtime and taxes: overtime can be left out of federal tax, state tax, or both: all of it, or just its extra over straight time (for places that don't tax overtime). FICA always counts it.
  • These are estimates of what's withheld, not a tax return; an employer's payroll decides the real paycheck. A paycheck whose deductions come to more than its pay counts as $0.00, and Needs a look says so.

Pay Changes

Pay that changes over time (a raise, a new deduction, a new W-4) goes in a Pay Change: it starts with the first paycheck on or after its day, and only needs what's new, since a blank box stays as it was before it (each one shows what that is). Older paychecks never change. The versions show as tabs over the pay's boxes (First paycheck, then each Change), and each section of boxes opens and closes (a change shows the ones it changes something in). Delete This Change takes one out.

On The Calendar

A calendar's paychecks are kept with it (what each one came to the last time it was read) and land like a connected spreadsheet's entries: from today on, behind a ➕, taken off and written again with every change; changing one for its day makes a temp that keeps the change; once a day passes, its paycheck stays as it was; and one with the same title and type as a recurring entry that day is left out. So everywhere this guide says connected spreadsheets' entries count (In Bank, Lowest, the 28 days after the calendar, Search, reminders, Equity, and Bob's page, whose Payday card counts them as paychecks), a calendar's paychecks count too.

Paychecks And Shifts

Under each calendar, Paychecks And Shifts opens this year's Take Home, Gross, Taxes, and Hours, and the Next Paycheck; a line with the next payday, its pay period, its hours, and its take home; the Schedule (four weeks from this workweek, with ‹ and › for others: each day's shifts, a long one shown where it starts with its hours, the days it goes on, and where it ends; ★ for premium; paydays; and each week's hours; on a phone each week is a list of its days); and every paycheck with hours, newest first (its pay period, hours, gross, pre-tax, taxes, post-tax, take home, and Paid or Upcoming). Tapping a paycheck shows how it adds up, line by line, and its shifts, piece by piece (the times, hours, Regular or Overtime or both, the rate, the rule, a break, and a stipend), with its bonuses. The shifts show once the calendar has been read on that page.

Staying Up To Date

  • Every calendar that's on is read again when Home opens (at most every 15 minutes each, on that device) or comes back into view, and every time the Spreadsheets & Calendars page opens. The budget only changes when its paychecks did, and the change is logged as "➕ Calendar Update" (with no Undo: the next read would only bring it back). A read that started before the calendar was changed is left out. Under each calendar, a line says what its last read found (and when, on this device): its shifts, its paychecks with hours, and how far it looks ahead.
  • If a calendar can't be read (its link was turned off, say), its last paychecks stay, and its box says why. A dropped connection isn't shown; it's just read again next time.
  • Off, On, and Delete work like a spreadsheet's, and the Change Logs name them ➕ Connect Calendar, ➕ Change Calendar, ➕ Calendar On, ➕ Calendar Off, and ➕ Delete Calendar.

Needs A Look

A calendar's box lists what to fix: no first paycheck or no base pay (nothing is added until they're filled in), a night rate without night hours, an all-day event with the bonus word but no amount, a repeat it can't follow, a paycheck below $0, an Equity account you don't have (or one on Regular paychecks), a calendar with too many events, or one that can't be read.

Limits

  • Up to 10 spreadsheets and calendars together, 8 MB for each calendar, 20,000 events read from one, a repeat counted up to 3,000 times in the days worked out, 40 pay changes, 40 title rules, and a look ahead of up to 12 months. Paychecks are kept from 400 days before today (their entries from 100), and only today's and later ones land.
  • The server downloads a calendar by its link and passes it straight to the page, without keeping it (the page can't fetch another site's calendar itself); the page works out the pay.

8. The Daily Update

The first time the budget opens on a new day, it brings everything up to date, no matter how many days were missed, in one pass:

  1. Days that joined the calendar while you were away get their Upcoming entries, then their recurring entries, then their connected spreadsheets' entries (as they were last read).
  2. Away over a month: only the first month after the budget was last used gets recurring and spreadsheet entries. The days after that get just their Upcoming entries and In Bank, so months of entries nobody checked don't have to be deleted by hand (and catching up stays quick). Adding an entry with the Quick Entry icon counts as using the budget. Days from today on get their recurring and spreadsheet entries as always.
  3. Every day that passed loses its placeholders whose last day passed (its own, Upcoming's, and its recurring and spreadsheet entries' that are placeholders); one with a later last day stays on its day as it is, and goes when that day passes, even from History. Days from today on (and Upcoming) lose the ones whose last day, picked before their own, has passed.
  4. A day that joined the calendar while you were away works out its % entries, from the Equity accounts' balances when the budget was last open and each day before it.
  5. Every day that passed has its recurring and spreadsheet entries turned into temps (❗️✔️, ❗️➕, and so on), and its % entries into plain amounts (what they came to), so they stay as they were that day.
  6. In Bank keeps going from the last known balance, and from the first day that lost a placeholder on (in History too), it's worked out again without it.
  7. Every week before the current week moves to History (newest on top), and the calendar becomes the current four weeks.
  8. The change is logged as "🕛 Daily Update", and the date it's done through is saved only after the data itself is saved, so a failed save simply happens again next time.

A brand-new budget starts today, with nothing to catch up. If the page stays open past midnight, the next change reloads it so the daily update runs first.

9. Equity (Like Savings)

Equity keeps track of money outside the budget's bank account, like savings, cash, investments, or a credit card.

  • Kinds: a new account picks Car, Mortgage, Credit Card, Debit, or Other (the kind is kept in its row's [16]; Savings and Cash have none, and any other account can change its kind). Other is the whole form. The rest show tips on what the kind is and how to fill it in, use its own words, show only the boxes it needs, and set the interest for it. Car: what's still owed, simple interest worked out on what's owed as the days go by, added on the payment's due day and kept apart (Separate Interest). A precomputed loan, where all the interest is set at the start, goes in as Other instead. Mortgage: the principal still owed, the note's interest rate (not the APR, which also counts fees), a twelfth of the rate each month on the due day, kept apart, and Escrow. Credit Card: the balance, its Credit limit (Max), and interest off to start, since paying in full each month usually costs none; on, it builds daily at the APR over 365 and is added on the statement's closing day. Debit: a checking account or debit card besides the one the budget follows, using the bank's current balance, with interest off to start (for one that pays it: the rate, not the APY). Car, Mortgage, and Credit Card are money owed, so a balance paid past $0 earns nothing.
  • Starting from a gem: a new account's window starts with a dropdown of the Debt Calculator's gems (when there are any), which fills in what the gem keeps: its name, what's owed, its interest, and its payment.
  • Add Recurring Entry? Once a new account is made, a window asks; yes opens New Recurring Entry filled in: a Transfer for the account, the kind's title (like Car Payment), the payment typed (or the gem's, and how often it pays), and its next due day.
  • Linking: a Hidden or Transfer entry for an account moves money into or out of that account. When you pick Hidden or Transfer for a new entry (on the calendar, in Recurring Entries, or with the Quick Entry icon), an Equity account choice appears, right under the refraction type and before the amount (which can be a % of the account): None, then each account as a button with its name, and its balance today on a second line (red below $0; with a Max, "$500.00/$2000.00"). Goals pick what they're for the same way. Picking one never changes the title: the account is kept after it, shown as "Payday → Savings" (with no title, "→ Savings"). Only an entry with an account picked is for it: one titled with an account's name and no account picked is an ordinary entry, and changes no account. A title can't be typed with → in it (New Entry, Recurring Entries, prisms, and spreadsheets say so), since the arrow is what marks the account picked. Each account after a title is its own entry, so "Payday → Savings" and "Payday → HSA" can be on the same day; the tracker and Search go by the title ("Payday"), and Search finds it by the account's name too.
  • From another account: a Transfer with an account picked has a From choice under it: In Bank to start, or another Equity account. From another account, that one plays In Bank's part: it changes by the entry's own amount, the account it goes to by the opposite, and In Bank doesn't change at all (moving $100 from Savings into an HSA is a −$100 Transfer: Savings −$100, HSA +$100). It's kept before the account it goes to, "Move ← Savings → HSA" ("← Savings → HSA" with no title of its own), so a title can't be typed with ← either; both accounts list it in their entries, the 28 days after the calendar and the Quick Entry icon's balances leave In Bank out of it too, Search's Equity account filter finds it by either account, and renaming either account renames it. A transfer can't come from the account it goes to, and From only shows for a Transfer with an account picked (New Entry, an entry's options, the recurring entry panel, and the Quick Entry icon's form; prisms and connected spreadsheets don't keep one). With the account it comes from deleted, it just stops changing that account, and In Bank stays out of it.
  • Transfers give the account the opposite amount: a Transfer moves money between the budget's account and the other account, so In Bank changes by the entry's amount and the account by the opposite. Moving $100 into savings is a −$100 Transfer: In Bank −$100, Savings +$100. Taking $200 out is a +$200 Transfer: In Bank +$200, Savings −$200.
  • Hidden entries give the account their own amount: a Hidden entry is money moving in the other account itself, so In Bank stays the same and the account changes by the entry's own amount, with the same sign. Putting $50 cash into savings is a +$50 Hidden entry (Savings +$50); paying $30 straight out of savings is a −$30 one (Savings −$30).
  • Balances: an account's balance is its starting amount plus all of its entries' changes (the opposite of each Transfer, and each Hidden entry's own amount), through today. Its panel lists its latest entries and the ones coming up, each with its own title (or its type, for one with no title). Tapping an account and typing what's in it today (like $3,000 in savings) sets the starting amount so today's balance comes out to it; no entry is made, so the calendar, tracker, and Search stay the same. It's logged in Change Logs as a change to the account.
  • % entries: a Hidden or Transfer entry for an account can be a percent of the account's balance as its day starts instead of an amount (see % amounts).
  • A balance can be below $0, like a credit card's: its box has Negative and Positive buttons (the amount is typed like any other, see Entries).
  • Interest: an account's panel has an Add interest switch and, while it's on, four boxes: Interest rate (APR, % a year), like a credit card's 24.99 (up to 1000, with as many decimals as it has, like 6.125); Compounds, how often interest starts earning interest of its own (Daily, like most credit cards and savings; Monthly; Every 3 months; Yearly; or Doesn't compound, where only the balance earns it, never the interest added to it); Added, how often it's added to the balance (every month, every 3 months, every 6 months, or every year); and On day, the day of the month it's added (1 to 31; a shorter month uses its last day). A new one starts on Monthly, every month, on today's day of the month. It's worked out a day at a time, to the cent, from the day after it started counting, on each morning's balance (its starting amount, its entries before that day, and the interest added before it): Daily, every day earns a 365th of the yearly rate, on the balance and the interest earned since it was last added; Doesn't compound, every day earns a 365th of it on the balance without the interest added to it; Monthly, Every 3 months, and Yearly, on its day every 1, 3, or 12 months, the balance that morning and the interest earned since it was last added earn that many twelfths of the yearly rate (a first stretch shorter than that earns a 365th a day). It's added on its day every 1, 3, 6, or 12 months, the first time in the month that many months after its first such day once it started counting (every month: that first day itself). So a balance below $0 (money owed) goes further below, and one above $0 grows. Each time it's added shows in the panel's entries as % Interest and counts in Balance, In 6 Months, and the Quick Entry icon's account list, but it isn't an entry, so the calendar, tracker, and Search don't show it. Turning it on, changing any of the four, or typing a new balance starts the count again from that day, with the interest so far kept in today's balance (so it's never counted twice); saving the panel with them as they were doesn't, and turning it off keeps today's balance as it is. Interest set up before these choices keeps working just as it did: monthly, added every month on the day of the month it started counting.
  • Separate Interest (a switch with the interest's choices): off, the interest added goes into the balance, like a credit card's. On, it's a balance of its own, like a mortgage's: the panel has Interest today right under the switch, with a ? on what it's for and how to use it (it and Balance today can each be typed in, Negative for interest owed), Equity shows it under the balance ("Interest -$512.40"), only the balance earns interest (what's added since it was last added still earns it the way Compounds says, then it's kept apart), and an entry the other way from the interest balance (a payment toward interest owed, or taking from interest earned) goes to the interest first and the rest to the balance. Everything that adds balances up counts the two together: the totals, In 6 Months, Bob's Accounts and Goals, % entries, and the Quick Entry icon's balances. Turning it on keeps the balance as it shows, with the interest balance at $0.00 (or what's typed); turning it off puts the interest back into the balance. Either way, like typing a balance, the count starts again from that day.
  • The page shows, at the top, the total of everything: In Bank (the budget's own account) plus every account, today and in 6 months ("Total in 6 Months"), and In Bank today on its own. Then each account's balance today, and In 6 Months (six months from today, to the day): what's still to come by then counts, its entries on the calendar and in Upcoming, the ones its recurring entries and connected spreadsheets will add (the way the daily update will fill those days in), and interest. The total's In Bank counts the same way. Tapping an account shows its latest and upcoming entries and lets you rename it or set its interest.
  • Savings and Cash are in every budget and can't be deleted (each shows a 🔒 in Edit, and its panel has no Delete), but either can be renamed. A budget that didn't have Cash gets it, right after Savings, the next time it opens (an account already called Cash becomes it). Savings is the default: Getting Started's savings goes into it.
  • Entries: tapping an account opens its panel, which lists every entry made on the account, in a box that scrolls (on the calendar, in History, and in Upcoming; a recurring or spreadsheet entry once it's on the calendar), newest first, each with its day ("coming up" after today), the entry, and what it put in or took out of the account (green in, red out), with its interest each month too (which doesn't open). Tapping an entry opens its options over the panel, like an entry on a zoomed day (one in History keeps the balances), and the list follows the change, and so does the balance at the top, unless a new one was typed there (Save only sets the balance when one was). A $0.00 blocker isn't listed.
  • Escrow (a switch right above an account's Entries, with a ? on what it is): the escrow part of a mortgage's monthly payment (property taxes and insurance) and the day the payment is due. Each month on that day it comes due, and money put into the account pays the interest owed first (with Separate Interest), then the escrow due, then the rest goes to the balance, so the balance follows just the principal; the escrow part leaves the account, and shows in its entries (and the Debt Calculator's) as Escrow. A payment short of both pays what it can in that order, and what's still due shows in the panel. Escrow changed or turned off starts the account counting again from that day, like interest. Kept in the account's row: [12] the amount, [13] its day, [14] what was due when it started counting.
  • Interest counts from its stretch's start: typing a balance again (or changing the interest or escrow) starts the account counting from that day, but the interest added next still counts from the last day interest was added (kept in the row's [15]), on the balances it had, the way a bank adds a month's interest at its end. An account added with interest counts from the last time its On day came. So typing a credit card's balance partway through its statement month, or a mortgage's, loses none of that month's interest.
  • Max (optional, right under Balance today in an account's panel, typed like any amount; lines set it and the balance apart from the interest, and the interest from the escrow): the most it can hold, like a credit card's limit. With one, its balance today shows over it on Equity, in its panel's account pickers, and in Goals: "$500.00/$2000.00". Blank is none. It only shows; it never stops an entry.
  • Renaming an account renames its entries (on the calendar, in History, Upcoming, and Recurring), the tracker aliases for it, connected spreadsheets set up with its name typed in (and the entries they read), and goals for it (see Goals), so they all stay with it. A spreadsheet whose cells name the account needs those cells changed to the new name, and its box on the Spreadsheets & Calendars page says so. A rename that would make two recurring entries match (the same title, type, and account) is refused, saying which (see Recurring entries).
  • Deleting an account leaves its entries where they are; they just stop changing an account.
  • Entries for an account keep their type everywhere else: a Transfer for one is still a transfer (it isn't a cost or gain, and only tracker rows set to count transfers count it), and a Hidden one is a cost or gain like any Hidden entry (the day's Gains and Costs show it, and the tracker, Search, and the Monthly and Yearly totals count it).

10. The Tracker

The tracker adds up entries by category over the last 4 weeks (today and the 27 days before), last 3 months (90 days), and last 365 days. It counts today and every earlier day, from the calendar and History.

  • Rows and aliases: each row counts the entries its aliases point to. An alias is an entry title, set to count All of its amounts, only its Costs, or only its Gains. If several rows have the same alias, each counts it.
  • Hidden entries always count, like Regular ones, even ones for an Equity account.
  • Transfers: rows leave out transfers unless the row's "Count ⭕️ Transfers in this row" switch is on (in its panel); such a row's title starts with ⭕️. A transfer only ever counts in a row like that.
  • Costs and Gains rows fill in by themselves with every cost and every gain (Regular and Hidden), except transfers.
  • Transfers fills in by itself with every transfer (all of their amounts) and lists their titles, so transfers never land in Undefined. A budget without it gets it just above Undefined. Searching it (Tracker) finds every transfer, checked.
  • Undefined fills in by itself with the titles no other row fully counts, and adds them up (never transfers). A title stays there if a row only counts its costs (or gains) and it has the other kind too. Its list is made again from the entries every time, so a title leaves it once a row counts it.
  • Interest, just under Transfers, fills in by itself with the interest every Equity account got (see Interest), below $0 for interest paid, and lists the accounts it came from. Interest isn't an entry, so no other row (or Costs, Gains, or Undefined) counts it, and Search can't find it. It counts from the day each account's interest last started counting (typing a balance, or changing its interest, starts it again, with what came before in the balance). A budget without it gets it under Transfers, and a row someone titled Interest before it came is renamed Interest Entries, so it keeps its aliases.
  • Costs, Gains, Transfers, Interest, and Undefined can't be deleted (they show a 🔒 in Edit, and their panels have no Delete button), since the tracker fills them in by itself. Every other row can be.
  • A new budget's tracker starts with an Unknown row too, counting Misc, Catchup, and Other: an ordinary row, so it can be renamed, changed, or deleted for good.
  • One row per title and transfer setting: a title can have one row that counts transfers and one that doesn't. Adding (or changing a row into) a match for one that exists is refused with a message, and Costs, Gains, Transfers, Interest, and Undefined can't be used as titles.
  • The panel shows each alias on its own line with All / Costs / Gains buttons (only the buttons pick it, and a title is kept as it's typed, like Disney+), and the table shows them in words, like "rent (costs)". Download My Data says them in words too.
  • In the table, a row's aliases scroll in a box about two lines tall, so a long list doesn't make the row tall (a box with more in it fades at the bottom). Tapping that box opens it all the way, with no scrolling, and tapping it again closes it; tapping a box that already shows everything opens the row, like the rest of it.
  • The table fits the screen's width, with no sideways scrolling: a row's title and the column titles take two lines when they need to, and phones get less space around each. On a phone the title column keeps about a fifth of the table, so a long title goes on two lines, and a word too long for it breaks (with a hyphen where the browser can); the Aliases column gets the room that's left. Edit (with its ≡ and checkbox columns) and the tracker's Search results pack the same way on every screen, and on the narrowest phones (under 360 pixels wide), Edit leaves the Aliases column out to make room.

12. Quick Entry (Home Screen Icon)

The Quick Entry button (on Home, above the calendar) sets up an icon for a phone's home screen that opens a New Entry form with no login.

  • Setting it up makes a long random key for the budget that's open (the icon always adds to that budget, and with more than one, its page says which: "Adding to sam's budget: Vacation."), and the page opens with the key in its link, to be added to the home screen, with the steps for the phone it's on (a list picks another: see Steps for each phone). A page opened inside another app (like Gmail or Instagram) can't add one, so the steps say to open it in the browser first. An account can have 10 icons; making an 11th stops the oldest one.
  • The key can only add entries to a waiting list, see, change, or take back the ones it added while they're still waiting, see In Bank today and the lowest it gets (with its day), see the account's Equity accounts with their balances and each one's Max (for the account picker, which shows them as "$500.00/$2000.00"), and read and change the account's prisms. With Show balances on Quick Entry icons off in Settings, it gets no balances at all: no In Bank, no lowest, and the Equity accounts' names only. It can't see anything else in the budget (no entries, titles, or History).
  • Account balances: the Equity accounts' balances are as of the phone's date, even when the budget hasn't been opened for days: each account's balance from the last time the budget was open, plus its entries (and interest) whose day has come since then (the ones on the calendar, and in the 28 days after it its recurring entries, connected spreadsheets' entries, and Upcoming entries, the way the budget will add them), plus Hidden and Transfer entries still waiting to be added for it, each from its own day on (a transfer from another account takes from that one). An entry dated later (like next week) doesn't change a balance until its day, the same as on the calendar, and a waiting placeholder stops counting once its last day has passed (the budget leaves it out). The list updates after each entry is added, changed, or taken back.
  • In Bank at the top: In Bank today and the Lowest it gets from today on (with its day, red below $0), side by side over the form. They come from In Bank on each day as the budget last saved it (today through the 28 days after the calendar), plus the entries waiting on this page, each from its own day on (a Regular or Transfer one changes In Bank, a Hidden one or a transfer from another account doesn't, one left on Auto counts as Regular, and a placeholder only until its last day passes). They update after each entry is added, changed, or taken back. Until the budget has saved In Bank by day (any change does, and so does the daily update), they don't show, and they never do while Settings has balances off (the account picker then lists the accounts without their balances).
  • On an Apple Watch (a Quick Entry link sent to yourself in Messages or Mail, then tapped on the watch), the page shows only In Bank today over the Lowest it gets (with its day), big, the same two as the top of the full page, one over the other (with balances off, just whose budget it adds to). The page knows a watch by its browser's name (or a screen too small for the form).
  • From the Lock Screen: the page's Help shows how to make an iPhone shortcut that opens the link (the Shortcuts app's Open URLs action, with a Copy Link button for it) and put it on the Lock Screen (iOS 18 or newer), the Action button, or Back Tap. Android phones' Lock Screen shortcuts can't open a web page, so the Help says so for each kind and suggests the home screen's bottom row instead.
  • Undo and Redo on the Quick Entry page: after adding an entry, Undo takes back the newest one added there while it's still waiting (only the icon that added an entry can take it back), and Redo adds it again. Once the budget has added it, the page says to undo it on the calendar instead, where it's an ordinary Undo step ("quick entry Tea (-$3.00) on 10/05"). The page forgets its Undo list when it's closed.
  • Waiting: beside Undo and Redo, Waiting (with how many) shows while entries added with this icon are still waiting, and opens a list of them over the form, newest first, each with its type, title, amount, and day (a placeholder's in yellow). Change puts one into the form as Change Entry (it glows blue-violet; Save Changes or Cancel, and either one brings back what New Entry had), where its title, amount, date, type, Equity account (and From), and Placeholder switch (and Delete it after) can all be changed; × deletes one, after asking, so it never joins the budget. Undo follows a change (it takes back the entry as it is now). Only the icon that added an entry sees it here; the list says how many more are waiting from the account's other icons. The moment a budget picks this icon's waiting entries up to add them (a budget on the device the icon belongs to, as it opens or, while it's open, within seconds; or Home's Add on another device), they're on their way in: the list still shows them, marked "Picked up by your budget", but they can't be changed, deleted, or undone here anymore (an entry the budget picked up but couldn't save yet comes back with the next open). Changing one or taking it back then says to do it in the budget instead. One waiting on another device's Home, in Quick Entries To Add, stays this icon's to change or take back until someone taps Add there.
  • Up to 100 entries can wait for each budget. The next time the budget opens on the device the icon belongs to (the one whose Quick Entry button made it, or a browser there that opened the icon's page), each of that icon's entries is added like a New Entry (to History if it's dated in the past, to Upcoming if it's after the calendar). Entries from other devices' icons, like a partner's phone on a budget you share, wait on Home instead, in Quick Entries To Add, where whoever has the budget open adds them or deletes them. Each one leaves the waiting list in the same database transaction that saves the table it was added to, so none are lost or added twice. One that can't be added (like a date before History begins) is dropped, and a message says why. (On an iPhone or iPad, a Home Screen icon keeps its own browser storage, so an icon made on another device and only opened from the Home Screen waits on Home too.)
  • % amounts: with Hidden or Transfer and an Equity account picked, the amount can be a percent of the account's balance (see % amounts), and so can a prism's. The page works out about what it comes to from the account's balance today for its own balances, and the budget works it out for its day.
  • Prisms: entries someone adds often, saved as presets under the form. A prism keeps any of a title, an amount (cost or gain), a refraction type, and an Equity account (with Hidden or Transfer, kept apart from the title), at least one of them, and never a date (New Prism has no date box). It can keep the Placeholder switch too (along with at least one of those): its button is yellow, and tapping it turns New Entry's switch on. Tapping a prism only fills those into New Entry (it adds nothing by itself; an Equity account renamed or deleted since the prism was saved isn't picked, and a note says to pick one), scrolls to it, and puts the cursor in the first box still empty, so the rest can be filled in, or Add Entry tapped. Add Prism turns New Entry into New Prism (it glows; what's already filled in counts), and Save Prism keeps what's filled in or picked (Auto counts as no type). Edit Prisms drags them into order by their ≡ and deletes them with ×. The ? next to Add Prism explains them. Prisms are saved with the account (up to 30, the whole list with every change), so every icon, and a new one after a password change, has the same ones.
  • A key stops working when the password is changed or reset, on Sign Out Everywhere, when Settings turns the icons off, when the account is deleted, or when its budget is deleted or isn't shared with the account anymore. Settings shows how many icons work. An icon whose key stopped working goes to the login page, which says to delete it and make a new one; the page opened without a key goes there too.
  • Why the key is in the link: it's what lets the icon skip logging in, and iPhones only save a home screen icon's address (not anything stored in the browser). Anyone with the link can add entries to the budget (and see what the icon sees), so keep it to yourself; changing the password, or Turn Off Icons in Settings, stops it.
  • Notes: the form's note (under its buttons, see Notes) goes with the entry, up to 20,000 characters, and can be changed in Waiting while it waits. Prisms don't keep one.
  • Back to Quick Entry: opened from the home screen, the icon runs as an app of its own. Its Home button opens the site in the phone's browser (at the login page, which goes on to Home when that browser is signed in), and the app stays on Quick Entry. When the app is left and opened again on another page, it goes back to the Quick Entry page it started on (unless something there isn't saved yet). Brought back that way, Quick Entry has a Back button (next to Home) to the page the app was on, which signs in again first if that time has passed; opened fresh from the icon, it has none. In the app, Quick Entry's links leave right as they're tapped (without the page sliding out first), since a phone can open the site's other pages outside the app, or hold back a link followed a moment after the tap. A Face ID or passkey sheet over it (under 3 seconds) doesn't count as leaving. In a browser's tab, a page stays where it was left.
  • The page isn't linked anywhere, is kept out of search engines, loads no analytics, and isn't tied to the web app manifest (so iPhones save its own link, key included).

13. Paycheck And Debt Calculators

The Paycheck Calculator works out a paycheck's take-home pay. Its 17 inputs come in four groups, and each calculation's inputs are saved to start the next one. Each box takes a number from 0 to 1,000,000,000 (a blank box counts as 0). The dollar boxes ($/hr and $) are typed like a cash register, filling in from the cents (2550 is $25.50, see Entries); hours, multipliers, and percentages are typed as they are.

  • Earnings: Base Pay ($/hr), Regular Hours, Overtime Multiplier (1.5× to start) and Hours, Premium Multiplier (2× to start) and Hours, Taxable Allowances.
  • Pre-tax Deductions: Medical (a percentage and a fixed amount), Retirement (a percentage and a fixed amount).
  • Taxes: FICA (7.65% to start), Federal, and State percentages.
  • Post-tax: Deductions (a percentage and a fixed amount), Non-taxable Reimbursements.

The math, rounded to cents at each step like payroll software: Gross = regular pay + overtime pay + premium pay + taxable allowances. Pre-tax medical lowers the pay that FICA and income taxes are figured on; pre-tax retirement lowers only the income-tax pay. FICA is figured on the FICA pay, and federal and state taxes on the income-tax pay. Take home = income-tax pay − taxes − post-tax deductions + non-taxable reimbursements. The page shows Take Home, Taxes, and Gross, and how it adds up.

Crystals (over the form) are presets of its boxes, like Quick Entry's prisms are for entries: a crystal keeps the boxes that were filled in when it was saved (and a name, if it was given one), and tapping it puts those in, leaving the rest as they are (nothing is worked out until Calculate). Add Crystal makes the form glow, and what's filled in already counts; Save Crystal keeps it. Edit Crystals drags them into order by their ≡ and deletes them with ×. A form that's being typed in (or made into a crystal) stays as it is when the page draws again. They're saved with the budget (up to 30, logged as "💎 Crystals"), so every device has the same ones.

Debt Calculator

The Debt Calculator (Menu, then Debt Calculator) works out when a balance owed (a loan or a credit card) is paid off, the interest on the way, and what paying more each time saves. Its results change as it's typed in, and its boxes are kept as they're left (2.5 seconds after they stop changing, logged as "🧮 Debt Calculator"), so they start it the next time, on any device: a day that has passed by then is left as it starts, and with an Equity account picked, its balance and interest come from the account again.

  • The Balance: Equity account (pick one to fill in what it owes today, its balance below $0, and its interest; None to type your own), Balance owed, Interest rate (APR, % a year, with as many decimals as it has; blank for none), Compounds, Interest added, and On day: the same choices as an Equity account's interest, worked out the same way (see Interest), counting from today.
  • Payments: Payment, Every (every month, every 2 weeks, or every week), First payment (today or later; a monthly payment lands on that day of each month, or a shorter month's last day), Extra each payment, and Pay it off by (both optional).
  • When It's Paid Off: the day it's paid off, how many payments that takes and how long, the interest, and what's paid in all (the last payment is only what's left). A payment that never pays it off (a year in, it still owes as much as at the start, since the interest adds as much or more) says so, and so does one that takes over 50 years. With an extra, the day it's paid off then, how many fewer payments that takes, and the interest it saves. With a Pay it off by day (up to 50 years ahead), the smallest payment (to the cent) that has it done by then. Under them, a note that it's an estimate (a lender's own figures can differ: its fees, how it counts days, and rounding). Each Payment lists every payment (with the extra, when there is one): its day, the payment, the interest added since the one before, and what's owed after it, in a box that scrolls.
  • Gems (over the form) are presets of its boxes, the same as the Paycheck Calculator's crystals: each keeps the boxes that were filled in when it was saved (never the days; with an Equity account picked, the account instead of its balance and interest, which come from it each time), and a name if it was given one. Add Gem, Save Gem, and Edit Gems work like Add Crystal, Save Crystal, and Edit Crystals (up to 30, logged as "💠 Gems").
  • With an Equity account picked: "(the account) At Your Budget's Pace" says when it's back to $0 with its own entries and everything the budget has coming for it (on the calendar, in Upcoming, and from recurring entries and connected spreadsheets, the way the daily update will fill those days in) and its own interest, looking up to 10 years ahead, with the interest until then; with an extra, the same with that much more on each payment day from the first payment, and how much sooner. Its Entries lists what's coming up (on the calendar, in Upcoming, and from recurring entries for the next year, with its interest), soonest first, then today and before, newest first, in a box that scrolls; tapping one opens its options, like on a zoomed day. A change to the budget (another device's too) works the account's part out again.

14. Change Logs

Every change is logged, newest first: the time it was asked for, how long it took (from then until the page had drawn it; the page shows a change right away and saves it right after; for the daily update, from asking the server for the budget until it's caught up), the action (like "❗️ Create Unique", "✔️ Create Recurring", "🔧 Tracker Entries", "🏦 New Account", "➕ Connect Spreadsheet", "➕ Spreadsheet Update", "➕ Calendar Update", "🔎 Search", "🧮 Calculator", "↩️ Undo", "↪️ Redo", or "🕛 Daily Update"), and up to four details (an undo or redo says what it took back or put back, and which days). A change that couldn't be made is logged in red as an Error (and nothing was changed); one that didn't find its entry is marked Not Found. While a budget is shared, each row's details also say who made it ("By:" and their username). The newest 1,000 are kept.

Undo, for each change: each row whose change can be taken back has an Undo at its right ("Undone" once it was). Tapping it (and saying yes) puts back what was there before that change, on any device: each day's entries it changed (on the calendar, in History, and in Upcoming), the recurring entries, tracker rows, and Equity accounts it added, changed, took off, or put in another order, the goals, Bob's settings, connected spreadsheets and calendars, and calculators it changed, and the notes. It only does while everything the change touched is still as it left it, so it never erases anything changed since: otherwise it says what changed (like "10/05 changed since"), the same as Home's Undo. Everything worked out from those (In Bank, balances, the tracker's sums) is worked out again. The Undo is a change of its own ("↩️ Undo", saying what it took back), with its own Undo, which puts the change back (and then the change's own row can be undone again). A Search, an Upload A Backup, the daily update, what reading the connected spreadsheets and calendars again finds ("➕ Spreadsheet Update" and "➕ Calendar Update": the next read would only bring it back), the Debt Calculator keeping its boxes, and a change too big to keep (over about 60 KB once saved, like an account renamed across years of History) have none, and only the newest rows keep theirs (about 800 KB together). Rows from before Undo came have none. A % entry's amount, worked out again whenever a balance changes, doesn't count as a change to it.

The table fits the screen's width: an action too long for its column ends in "..." (tap it to see it whole), and the details scroll in a box about two lines tall that a tap opens all the way (see Recurring Entries, History, Equity, Tracker).

15. Daily Reminders

On days the budget needs a look, a "🗓️ Check Budget" reminder can arrive at a chosen time (8:00 AM to start, in the device's time zone). A day needs one when:

  • ⛔️ its In Bank is below $0;
  • ✔️ an uncommon recurring payment lands between that day and the end of its four-week calendar;
  • ❗️ it has a cost;
  • 🔔 an entry with a reminder is that many days away (an entry on a day after today can have one: Remind me, a number of days before its day, 0 for the day itself, in New Entry, an entry's options, and Quick Entry; it's kept with the budget's notes and goes wherever its entry goes, and goes once its day comes or its entry does). Its line names the entry: "🔔 Rent is in 3 days (Fri, Nov 27)".

Settings' Reminders card has a switch for each kind (entry reminders on to start, the rest off), kept for the account on the server, which sends only those. Right after a sign-in, Home asks once whether to turn push notifications on there (Turn On asks the browser; Not Now waits for the next sign-in; Settings' Turn Off stops it asking on that device).

The website works out which days need one (from today through the 28 days after the calendar) and sends that list to the server whenever it changes. Reminders arrive two optional ways:

  • Push notifications on each device that turns them on (up to 10 devices). The server checks every 5 minutes and sends any that are due. On iPhone and iPad, the site has to be added to the Home Screen first.
  • A calendar link (an .ics feed with a private code) for Google Calendar, Apple Calendar, or most calendar apps. Each reminder is a 30-minute event with an alert.

An account's reminders are about one budget: its first, until the Daily Reminder card's Reminders are about (there when the account has more than one budget, its own or shared with it) picks another. The days come from that budget whenever it's open, on any device, by anyone it's shared with, and tapping a push notification opens it. Picking another budget starts over with that one's days, the next time it's open. When the budget picked goes (it's deleted, or isn't shared with the account anymore), the reminders go back to the account's first budget.

16. Budgets And Sharing

An account can keep more than one budget, and share any budget it owns with other Prismal Planning accounts, so two or more people can each keep a budget of their own and share one too. Each budget is whole on its own: its calendar, History, Upcoming, recurring entries, tracker, Equity, goals and Bob's cards, connected spreadsheets and calendars, calculators, notes, Change Logs, Undo steps, and daily update. Every account starts with one, "My Budget".

  • The budget picker: on every signed-in page, a button just above the header's buttons, as wide as they are together, shows the budget that's open (a long name ends in "..."), with a pink dot while invitations wait. Tapping it drops down the list: Yours (your own budgets), Shared With You (each says whose it is: "From sam"), and Invitations (each with Join and Decline), then New Budget and Manage (Settings' Budgets card). The open budget glows and says "Open now". Tapping another one opens it, and the page you're on opens again with it (a change that hasn't reached the server yet asks first).
  • Share: each budget you own has a small Share beside it, in the list and in Settings. Share takes the other account's username or email (its own email, or one of its confirmed Other Emails), and that account is invited. Under it is everyone the budget is shared with, each with Stop Sharing, or Cancel Invite for someone who hasn't joined yet; someone invited by email is listed by that email until they join, then by their username. A budget shared with you has no Share: only its owner can share it, so nobody it's shared with can pass it on.
  • Joining: an invitation shows in the invited account's list (with the dot on its picker), saying whose budget it is. Join puts it under Shared With You, ready to open; Decline takes the invitation away. Nothing in the budget can be seen until it's joined.
  • What sharing allows: everyone a budget is shared with can open it and change anything in it, the same as its owner: entries, recurring entries, Equity, goals, Bob's cards, connected spreadsheets and calendars (their links too, and a calendar's pay and tax settings), the calculators, notes, and an Upload A Backup into it. They see its owner's username and the usernames of everyone else who joined. Only the owner can share it, rename it, or delete it. Each person's own things stay their own: their email, password, passkeys, reminder time, Quick Entry prisms, and their devices' choices.
  • Seeing each other's changes: a shared budget open on two people's devices shows each one's changes on the other's within about 5 seconds, the same as one person's two devices (Live updates), and while it's shared, Change Logs say who made each change.
  • Leaving, stopping, and deleting: someone a budget is shared with can leave it (Settings, Budgets, Leave), and its owner can stop sharing it with them. Either way, what they added stays in the budget, their Quick Entry icons for it stop working, their reminders go back to their own first budget, and a page that has it open opens one of their own budgets instead and says why. An owner can delete any of their budgets but the first (which can be renamed), for everyone it's shared with, and deleting an account deletes the budgets it owns the same way.
  • New Budget (in the list, or Settings' Budgets card) asks for a name, and the new budget opens right away, empty but for Savings and Cash, with its Getting Started card. Names are 1 to 30 characters, with the same rule as usernames about characters you can't see.
  • Which budget opens: each browser tab keeps the budget it has open, so two tabs can have two budgets open, and each saves only to its own. A new tab, and signing in, open the budget the account opened last, and a reminder's notification opens the budget the reminders are about.
  • Quick Entry: an icon adds to the budget that was open when it was made (Home's Quick Entry), and when the account has more than one budget, its page says which ("Adding to sam's budget: Vacation."). It stops working if that budget is deleted, or isn't shared with its account anymore. Entries waiting from someone else's icon show on Home's Quick Entries To Add, for whoever has the budget open to add or delete.
  • Connected spreadsheets and calendars in a shared budget are kept up to date by whoever has it open, each reading the ones they can: a spreadsheet shared only with [email protected] opens just for the emails of the person who connected it, so only they read it again. A read that fails on someone else's device (like one whose email isn't verified yet) isn't kept as the connection's problem.

17. Accounts, Sign-In, And Security

  • A person, not a bot: creating an account includes Cloudflare Turnstile's check that you're a person. It runs by itself while the form is filled in, and only shows a box (above Create Account) when it needs a tap. An account can't be made without it, from the page or any other way.
  • 18 and older: Prismal Planning is intended for people 18 and older. Creating an account asks for a birth date (typed, or picked with the calendar button); under 18 on that day, or a day more than 120 years ago, and an account can't be made. The birth date is stored with the account, and Settings can fix one typed wrong (never to under 18). The Privacy Policy & Terms of Use say so too.
  • Verified emails: a new account's email gets a link to verify it, and so does a changed email (which isn't verified until then; links sent to the old address stop working). Each link works for 24 hours, and tapping it again says the same thing instead of an error. Settings' Send Verification Email sends a new one. A password reset link that works also verifies the email when it went there (one sent to an Other Email doesn't). Connecting and reading spreadsheets need a verified email, since sharing a spreadsheet privately depends on it, and so does adding Other Emails; nothing else needs it. Other Emails (Settings, under Email) are confirmed the same way, each by its own link, and only a confirmed one signs in or gets reset links.
  • Usernames: 5 to 30 characters, counted the way a person would (an accented letter, or an emoji, even one made of several joined emoji, is one). Any characters you can see work: letters in any language, numbers, symbols, emoji, @, and spaces (extra spaces are tidied). Characters you can't see, or that change which way text runs, aren't allowed, since they could make one username pass for another. "Sam", "sam", and "SAM" count as the same username, so only one of them can exist.
  • Signing in works with the username (in any capitals), the account's email, or one of its confirmed Other Emails, and Forgot Password works with any of those emails too (the link goes to the email typed). After too many wrong passwords, signing in pauses for a while; Forgot Password and passkeys still work.
  • Passwords: at least 8 characters and at most 256, and any characters work (spaces, symbols, emoji, other languages). The same password typed on another keyboard or device still matches. A new password (making an account, changing it, or resetting it) that has shown up in data breaches is refused. Passwords are never stored as they're typed.
  • Staying signed in: signing in (with the password or a passkey) lasts up to 24 hours, and 15 minutes without activity signs you out, with a counting-down notice in the last minute. Logout signs that device out. A device signed out from somewhere else (by Sign Out Everywhere, or a new password on another device) goes to the login page at its next request, and the login page says why. Logout with a change that hasn't reached the server yet (offline) asks first.
  • A new password: changing it in Settings (with the current one) signs out every other device and stops every Quick Entry icon; this device stays signed in. Resetting it with an emailed link (which works once, for an hour) signs out every device, stops every Quick Entry icon, and turns passkey sign-in off. Sign Out Everywhere signs out every device, that one too, and stops the icons.
  • Privacy Policy & Terms of Use updates: when they change, every account with a verified email gets an email saying so, with when the new version takes effect, what changed, and a link to it (a few accounts every few minutes, until all have it). An account made after the change already agreed to the new version, so it isn't emailed. The policy page carries its version (its Effective Date) and a short note on what changed, which the server reads once an hour.
  • Security notices: a password change is reported to the account's email, an email change to the old address (with the new address partly hidden; the new one gets its verification link), and a new passkey to the account's email. Emails are sent through Resend.
  • Changing the email or password, adding a passkey, or deleting the account needs the password. Deleting the account deletes all of its data, passkeys included, and the budgets it owns, for everyone they're shared with; what it added to budgets other accounts shared with it stays in those, and entries its Quick Entry icons left waiting there go.
  • Analytics: Google Analytics loads only when the device hasn't turned it off in Settings and the browser doesn't send Global Privacy Control or Do Not Track. The page addresses it gets leave out everything after the page's name, so private codes in links (like a reset or verification link's) never reach it. It never sees budget data.
  • Security: Prismal Planning uses reasonable security measures to protect accounts and their data. How they work isn't published here.

Passkeys (Face ID, Touch ID, Windows Hello)

A passkey signs you in with your face, your fingerprint, or your device's PIN instead of your password. It's the web standard (WebAuthn) behind "sign in with Face ID", and it works with Face ID and Touch ID on Apple devices, Windows Hello, Android's fingerprint or face unlock, password managers, and security keys. Passkeys are optional, and the password keeps working either way, so a lost phone never locks anyone out.

  • The account's setting: passkey sign-in is unset, on, or off for each account. It starts unset, and adding a passkey turns it on.
  • Turning it on when signing in: turning on Turn on passkey sign-in on the login page, then signing in with the password, makes a passkey for that device and turns it on (or, if the device already has one of the account's passkeys, just turns it on). Yes, Turn It On tries again if it was cancelled, and No Thanks skips it for now without changing anything.
  • Signing in with a passkey: Sign In With A Passkey, or picking a passkey under the username box. The passkey says whose it is, so no username is needed. The device's check opens right away (the page keeps a sign-in ready, since Safari only opens it right in a tap). If passkey sign-in is off for the account, the page says so and turns the switch on, so signing in with the password turns it back on.
  • The device's last passkey: the device remembers which passkey it last signed in with or made (just the passkey's ID, which says nothing about the person, kept after signing out), when that passkey is on the device itself: one used from a phone (by its QR code) or a security key isn't remembered, and removing a passkey in Settings forgets it. Each time the login page shows, except right after Logout, Sign Out Everywhere, or deleting the account, it asks the device for that one passkey by itself, so signing back in is one step. A browser that only opens passkey requests in a tap (like Safari) says no at once, and the page carries on as usual; a passkey the server doesn't know anymore, or one for an account with passkey sign-in off, is forgotten so it isn't tried again, and one whose request was cancelled twice in a row waits (a device that lost the passkey, or that someone else uses, stops asking for it) until the device signs in again, any way, and then it's tried again.
  • Turning it on or off in Settings: On and Off apply to the whole account. Off keeps the passkeys, but none of them can sign in until it's turned back on. Turn On needs at least one passkey; with none, the Turn On button adds one. Adding a passkey always turns it on.
  • Making one: the password is checked, then the device asks for the face, fingerprint, or PIN and saves the passkey (often in iCloud Keychain, Google Password Manager, or Windows Hello, which may sync it to the person's other devices). Each passkey gets a name, like "iPhone" or "Windows", that can be changed when adding it. An account can have up to 20, and a device that already has one of the account's passkeys says so instead of making another.
  • What's stored: for each passkey, its public key, its ID, its name, the site it was made on, when it was added and last used, whether the device said it's synced, and a sign-in counter; for the account, the setting and a random ID that devices keep with its passkeys (it isn't the username or anything else about the person). The private key never leaves the device or password manager, and faces, fingerprints, and PINs never leave the device: the site never receives them.
  • Only on Prismal Planning: a passkey only works on the site it was made on, so a look-alike site can't use it. Which company made the device isn't asked for or stored.
  • Removing: Remove in Settings deletes a passkey from the server, so it can't sign in. Browsers that support it are told to stop offering it, and it can also be deleted in the device's password settings. A removed passkey that's still on a device gets "That passkey isn't on any account anymore".
  • A password reset turns it off, so a passkey someone else added stops working too. The owner checks the list in Settings, removes any that aren't theirs, and turns it back on.

18. How The Data Is Stored

Data lives in a Cloudflare D1 (SQLite) database. Each part of a budget is one table, holding one row per budget whose content is the whole part as JSON text. A budget's rows are kept under its key (the user_id column): an account's first budget under the account's own ID, where its budget always was, and every other budget under the negative of its number, so the two never meet. When something changes, only the parts that changed are saved, each in one piece. If a part's stored copy can't be read when the budget opens, it's never overwritten, so it can still be recovered.

Every date in these tables is stored the same way whatever the device's language, region, or time zone (see Dates, time zones, and formats). Each device also keeps its own choices in the browser (localStorage), and they stay after signing out: the date format (prismal_date_format: mdy, dmy, or ymd, or none for the device's own) analytics (prismal_analytics), the kind of phone picked in a Steps for list (prismal_device), the ID of the passkey it last signed in with (prismal_last_passkey, which the login page tries by itself; |declined after the ID once a try was cancelled), whether music and sound effects are off (prismal_music and prismal_sound_effects: off, or none for on), the theme (prismal_theme: professional, dark, spooky, elements, poison, blue, fall, winter, festive, floral, digital, love, clovers, playful, mechanical, or custom, or none for Prismal) a Custom theme (prismal_custom_theme: the theme it starts from, its five colors, and its corners, font, stars, and icons), the Quick Entry icon (prismal_quick_icon: its colors, what's on it, and the finished picture, with an uploaded image as a small square copy), Reduced Motion's switches (prismal_still_stars and prismal_less_motion: 1 while on), the Quick Entry icons it made or used (prismal_quick_icons: the first 16 hex digits of the SHA-256 of each icon's key, up to 20, newest first; their entries are added when the budget opens there), and the day picked for the Equity window on Bob's page (prismal_bob_accounts_day, MM/DD/YYYY). Each tab keeps the budget it has open in its own sessionStorage (prismal_budget: { user, id, name }), forgotten on sign-out. A Quick Entry icon opened as an app keeps the Quick Entry page it opened on (prismal_quick_app), when it was last left (prismal_app_left), and the page it came back to Quick Entry from, for Quick Entry's Back (prismal_quick_return, read once, so Quick Entry opened again later has no Back), in the app's sessionStorage.

TableHoldsFormat
calendarThe four weeks4 rows × 7 days of cell text (see the calendar). A placeholder's emoji ends in ⏳, after its type and mark (❗️⏳, ✔️⏳, ❗️✔️⏳, ➕❗️⏳), the same in Upcoming and on a recurring entry; the page shows it in yellow instead. With a last day picked for it, that day follows the ⏳ (❗️⏳2026-11-15), and a recurring entry's has how many days after each day it lands on (✔️⏳+3) or before it (✔️⏳-3), which the days it lands on keep. An entry for an Equity account has the account after its title (Payday → Savings), and a Transfer from another Equity account has that one before it (Move ← Savings → HSA). A % entry's emoji has % (a full-width percent sign) and its signed percent after its type and mark, before a placeholder's ⏳ (⭕️%-10, ✔️⭕️%-5, ⭕️✔️%-10⏳), the same in Upcoming, on a recurring entry, and on a connected spreadsheet's entries; the amount after it is what it comes to.
historyPast weeksRow 0: day names; then one row per week (newest first), each 7 cells: MM/DD/YYYY, the In Bank line, then entries.
recurringRecurring entriesRow 0: Monthly and Yearly; row 1: column titles; then [title, amount, start MM/DD/YYYY, frequency, end date or "None", type emoji]. A section heading is ["-", heading, "", "", "", "-"].
trackerTracker rowsRow 0: column titles; then [title, last 4 weeks, last 3 months, last 365 days, aliases] (the Interest row has "auto" in a sixth cell, which tells it from a row someone titled Interest before it came: that one is renamed Interest Entries). A section heading is ["-", heading, "", "", "-"].
futureUpcomingRow 0: column titles; then [title, amount, date MM/DD/YYYY, type emoji].
accountsEquity{ "version": 3, "list": [[column titles], [name, balance today, "default", "cash", or "", starting amount, interest rate, interest since, max, compounds, added every, added on, separate interest, interest balance], …], "equity": {…}, "coming": [[name, "YYYY-MM-DD", change], …], "inBank": [["YYYY-MM-DD", amount], …] }. The balance today is the starting amount (blank is $0.00) plus the entries and interest, filled in for Quick Entry; "default" marks Savings and "cash" marks Cash (the two that can't be deleted). Max is the most it can hold ($2000.00, blank for none). The interest rate is a yearly percentage like 24.99 (blank for none), and interest since is the day it started counting (MM/DD/YYYY). Compounds is "daily", "quarterly", "yearly", "simple" (doesn't compound), or blank for monthly; added every is "3", "6", or "12" months, or blank for every month; and added on is the day of the month it's added ("1" to "31"; blank, as in rows from before these, is interest since's day of the month). Separate interest is "separate" with Separate Interest on (blank otherwise), and interest balance is the interest kept apart on the day interest since says (-$50.00; the starting amount counts it too). coming is each account's changes after the budget's day (the calendar's days after today, then the 28 days after the calendar the way the daily update will fill them in, and interest), which Quick Entry counts once their day comes. inBank is In Bank on each day from the budget's day through the 28 days after the calendar, for Quick Entry's In Bank today and lowest. equity keeps older business (LLC) equity tables as they were stored; the website doesn't show or change them. goals (left out with none) is the goals: [{ title, kind: "inBank" | "total" | "account", account, amount, percent, date, made, start }], where title is "" for none, kind is "none" for a goal set before goals needed what they're for, account is the account's name (for account), percent a % goal's percent (null otherwise), date ("" for none) and made (the day it was set) are MM/DD/YYYY, and start (left out by older goals) is what it was for held when it was set. bob (left out until something's set) is Bob's page: { cards: [the ids of the cards that are on: goals, purposes, payday, pace, bills, weekly, catchup, refund], purposes: { title (as the tracker compares it) -> a wavelength's id }, wavelengths: [{ id, name }] }, where wavelengths (1 to 10, in order from the longest wavelength to the shortest) is left out while they're the defaults (needs Needs, wants Wants, and future Future), and one added later gets an id like w1. bankHolds (left out when empty) is { "MM/DD/YYYY": amount }: what holds In Bank steady on a calendar day before the last Catchup (see Changing a History entry). An account row's last column, [16], is its kind: car, mortgage, credit, debit, or blank for any other.
calculatorPaycheck and Debt CalculatorsRows of [label, value]: rows 0 to 2 the Paycheck Calculator's last results, rows 4 to 20 its last inputs, row 21 its crystals, row 22 the Debt Calculator's boxes as they were last left ({ box: value }), and row 23 its gems, each as JSON text (crystals and gems: [{ "name", "values": { box: value } }], only the boxes that were filled in).
logsChange LogsRow 0: column titles; then [time, how long, action, 4 details, status, what it changed, who made it], newest first (who made it: the username, shown while the budget is shared). What it changed is JSON text, for the row's Undo (see Change Logs): { "id", "days": [{ "date", "before", "after" }], "rows": [{ "table", "removed", "added", "order" }], "values": [{ "part", "before", "after" }], "notes": [{ "part", "key", "before", "after" }], "undone" }, or blank for a row without one.
sheetsConnected spreadsheets and calendars{ "version": 1, "list": [{ id, name, link, on, fields, entries, problems, tabs, access, by, placeholder }] } (a calendar adds kind: "calendar", pay, its pay settings: { versions: [{ from: "YYYY-MM-DD", ...settings }], rules, lookAhead: { count, unit }, only, skip, bonusWord }; paychecks, what each paycheck came to when it was last read; and checked, { shifts, paychecks, from }; its fields are typed only: title, type, and account) (placeholder: true when its entries are placeholders, left out otherwise). fields has date, title, amount, type, and account, each { tab, range: "B2:B50" } (cells; amount adds sign: written, costs, or gains) or { value } (typed: a title, a signed amount (a percent, with percent: true), a type emoji, or an account's name). entries are what it read last, [date MM/DD/YYYY, type emoji, amount, title]; problems what needs a look; tabs its tabs' names; access public or shared (with [email protected]); by the username that connected it or changed it last (left out by older ones, which are the budget owner's). When each device last read each one is kept on that device (prismal_sheet_reads), not here.
notesEntries' notes{ "version": 1, "entries": { "YYYY-MM-DD|title|type": note }, "recurring": { "title|type": note } }: the title as compared (lowercase, letters and numbers, with its Equity account after →), and the type regular, hidden, or transfer (see Notes).
search(unused)Kept as stored for older budgets; Search doesn't use it.
usersAccountsUsername (and the form that decides whether two usernames are the same one); the password, only as a one-way hash, never as typed; email, and when it was verified (email_verified_at: empty until its link is opened, and again after the email changes); birth date (as given when signing up, or fixed in Settings; accounts from before birth dates keep the age they gave); when the terms were agreed to; the passkey setting (passkeys_on: empty until asked, then 1 for on or 0 for off); whether Quick Entry icons show balances (quick_balances: empty or 1 for on, 0 for off); the random ID the account's passkeys carry; the Privacy Policy & Terms of Use version it was last emailed about (policy_notified); and the budget it opened last (last_budget, empty for its first).
sessionsSigned-in devicesOne row per signed-in device: the account, and when it signed in and when that ends. Deleted on logout, when it ends (24 hours), when the password changes or is reset, and on Sign Out Everywhere.
budgets, budget_peopleBudgets and sharingEach budget: its number, its owner, its name, whether it's the owner's first, and when it was made. Each person a budget is shared with: the budget, the account, what the owner typed to invite them (a username or an email), when, and when they joined (empty while it's an invitation). Deleted with the budget, when they leave or the owner stops sharing it, and with either account (see Budgets and sharing).
data_revisionsSaving safelyOne number per budget that goes up with every saved budget table. Saves send the number their page has, and one from an older copy is refused (see How the website is built).
rate_limitsLimitsBrief counts that protect accounts from password guessing and the site from spam (a network only in a scrambled form, never its IP address), each deleted within about an hour.
passkeysPasskeysOne row per passkey: its ID, the account, the site it was made on, its public key, a sign-in counter, how the browser reaches it, its name, whether it's synced, and when it was added and last used.
passkey_used_challengesPasskey sign-insPasskey sign-ins already made, for a few minutes.
site_stateThe site itselfThe Privacy Policy & Terms of Use's current version and what changed, as read from its page (see Accounts, sign-in, and security).
user_settingsThe daily updateThe last day each budget's daily update was done through.
notify_settings, push_subscriptionsRemindersReminder time, time zone, the budget the reminders are about (empty for the account's first), the days that need one, the calendar link's code; each device's push address.
password_resetsReset linksEach link, in a form that can't be turned back into the link, the email it was sent to, and when it expires.
email_verificationsVerification linksEach link, the same way, with the account, the address it went to, and when it was sent and expires. Deleted when the email changes, and once expired.
sheet_emailsOther EmailsEach email an account added under Other Emails (Settings, under Email), when its link was opened (empty while it's waiting), and its newest link, the same way as reset links, until that expires, with when it was sent and added. Deleted with Remove or the account, and once its link expires if it was never confirmed.
quick_keys, quick_entries, quick_prismsQuick EntryEach icon's key, in a form that can't be turned back into the key, with the budget it adds to; the entries waiting to be added, under their budget's key, each marked with the icon that added it, so only that icon can see, change, or take it back, and with when a budget first picked it up to add it (from then on it can't be changed here); and one row per account with its prisms, [{ title, amount, type, account, placeholder, percent }] as JSON ("" or null for what a prism doesn't keep; type is regular, hidden, or transfer; placeholder is true or left out, the same as on a waiting entry, and percent a % amount's percent or left out, the same too).

Backups

Download My Data (Settings, Your Data And Privacy) saves everything stored for the account as one JSON file (see GET /api/account/export), and Upload A Backup, just under it, brings a budget back from one. The file is read on the device, never sent anywhere as a file: what it brings back is saved like any other change.

  • It goes into the budget that's open, which the window names. It says whose file it is and when it was downloaded (a file with more than one budget has a list to pick which of them, its owner's first budget first), then lists each part of that budget the file has: History, Home's Calendar, Upcoming, Recurring Entries, Equity, Goals, Bob's Page (the wavelengths, each title's wavelength, and which of his cards are on), Tracker, Connected Spreadsheets And Calendars, Paycheck Calculator, Notes, and Change Logs. Each says how many the backup has, how many the budget has, and how many of them clash.
  • For each part, pick Prefer Current Data (where the two clash, the budget's stays, and everything else from the backup is added), Prefer Uploaded Data (the same, but the backup's wins where they clash), or Remove Current Data (the budget's part is removed, and the backup's takes its place). Set All picks one for every part. A part the budget has none of yet just takes the backup's, and one the backup doesn't have stays as it is.
  • Two things clash when they're the same thing with something different: an entry with the same title (and Equity account) and type on the same day, a recurring entry with the same title, account, and type, an Upcoming entry with the same day, title, and type, an account with the same name (Savings and Cash go by what they are, whatever they're named), a goal with the same title and what it's for, a tracker row with the same title, a connected spreadsheet that's the same connection, a note on the same entry, or a title's purpose.
  • Days go by their dates, wherever the backup kept them: its calendar's first weeks can be History by now, and its Upcoming entries on the calendar. On a day that passed, an entry that had landed by itself (from a recurring entry or a connected spreadsheet) stays as it was, the way the daily update keeps one, and a placeholder doesn't come back; from today on, the recurring entries and spreadsheets land theirs again. History is put back as whole weeks from its first day, each day with its In Bank from the side that wins (a day neither has keeps the In Bank of the day before), and the calendar's In Bank is worked out again from History's last day.
  • It's one change, logged in Change Logs ("📥 Upload Backup": where it's from, and which parts kept the budget's, took the backup's, or were replaced). Undo can't take it back, so the window offers Download My Data first, and Remove Current Data asks once more. A part that would be too big to save is refused, and nothing changes.
  • The budget's own settings and the account's stay as they are: the email, password, passkeys, reminders, Quick Entry icons and prisms, and the last daily update.

19. How The Website Is Built

  • The website is plain HTML, CSS, and JavaScript with no build step, hosted on GitHub Pages at prismalplanning.org.
  • The budget's logic runs in the browser. When the budget opens, the website loads every table, runs the daily update, and works out everything that's computed (In Bank, the 28-day lines, Bob's message, the tracker, account balances). Every change goes through one function that runs changes one at a time, takes a snapshot first (and puts it back if anything fails, so half-made changes are never saved), refreshes the computed parts, logs the change, saves the tables that changed, and tells the page to redraw.
  • The server is a Cloudflare Worker (an API) with a D1 database. It handles accounts, sign-in (passwords and passkeys), storing tables, Quick Entry, reminders, cleaning up expired records, and emailing accounts about an updated Privacy Policy (a scheduled job every 5 minutes), email (through Resend), and downloading connected spreadsheets (which the page reads itself). It doesn't do budget math.
  • Which budget: every request about a budget names it (?budget= its number, or last for the one the account opened last), and the server answers only for a budget the account owns or has joined, so a save never lands in another one. A request that names none is for the account's first budget, the way every request was before an account could have more than one. A page keeps the budget it loaded until it's opened again (Budgets.js), and a budget that's gone (404 { budgetGone: true }) opens one of the account's own instead.
  • Saving safely: each budget has a revision number that goes up with every saved table. The page keeps the number it loaded (and each save's new one), and sends it with every save. The server writes a table only when the number still matches, all in one transaction; otherwise nothing is written, the reply is 409, and the page reloads with the newest budget and says the last change needs to be made again. While a page is on the screen, it asks for the number every 5 seconds (GET /api/data/revision, which also sums up the waiting quick entries), and when the budget changed elsewhere it loads the budget again in place and redraws (Live updates); a page coming back into view asks right away. A save that couldn't reach the server stays marked, is sent again when the connection comes back (and every 30 seconds), and leaving before then asks first.
  • Undo and Redo: a calendar change or quick entry gives runBudgetAction an undo label and the days it touches. Before and after the change, it keeps each of those days' own entry lines (❗️, ✖️, ⭕️, and temps; never the lines the budget writes itself), plus the Equity accounts' equity tables if the change touched them, and only the days that changed become the step. Undo puts each day's "before" lines back, but only while every one of those days still holds its "after" lines (Redo is the same the other way); then everything computed is rebuilt like after any change, and it's saved and logged like one. A step that no longer matches is refused and dropped. Steps are kept per tab in sessionStorage (prismal_undo_<username> for the account's first budget, and prismal_undo_<username>_<budget> for each other), 25 at most per budget, and cleared on sign-out. The Quick Entry page keeps its own list in memory, takes entries back with /api/quick/unqueue, and follows a waiting entry changed in its Waiting list (Undo takes back the entry as it is now).
  • Loading and updates: every page starts with Boot.js, which works out which page it is, sends signed-out visitors to the login page (except on public pages), and loads that page's scripts. GitHub Pages shows 404.html at any missing address, so that page marks itself (data-page="notfound") to be recognized. A browser that blocks site data gets a message saying how to allow it instead of a blank page.
  • Caching and releases: pages and Boot.js are always checked for a newer copy (Cloudflare sends them with Cache-Control: no-cache, so one that hasn't changed costs a quick "not modified" answer), so a release reaches everyone on their next page, with no reload. Every other file's address carries its fingerprint, the first 10 hex digits of the SHA-256 of its contents (like /Javascript/Layout.js?v=d669486b33), so browsers and Cloudflare keep their saved copy until that file really changes, a changed file's new address gets the new copy right away, and files that didn't change stay saved. Pages and stylesheets carry fingerprints in their links, and Boot.js carries them for the scripts and sprites it loads (FILE_VERSIONS, used through assetUrl); _tools/stamp.mjs writes them all (see Notes for developers).
  • Speed: the site's font, Bpmf Huninn, comes in two parts made from BpmfHuninn-Regular.ttf (which no page loads): its Latin letters, numbers, Greek, and symbols (Fonts/MainFont-Latin.woff2, 24 KB, preloaded by every page) and its Chinese, Japanese, and Bopomofo characters (Fonts/MainFont-More.woff2, 1.8 MB), which a browser only downloads for a page that shows one of them (CSS unicode-range). The header buttons', tabs', and other buttons' icons are small WebP images in Resources/Icons/ (under 6 KB each). The background picture (Resources/Background.webp, 5 KB) is built into stylesheet.css, with its average color under it, so it paints in a page's very first frame instead of a moment later, and the starfield gets a head start: Boot.js, which runs first, starts the starfield's worker and loads and decodes its star image (a 34 KB WebP) while the rest of the page loads, and Starfield Setup.js hands both over, so the stars are drawn as soon as the page shows. Google Analytics loads after the page has, so it never holds the page up, and pages slide in when they've loaded (or after 1.5 seconds at most). While a page slides out, the browser already fetches the next page, Boot.js, and the page's scripts (<link rel="prefetch">, in browsers that have it), so they're on hand when it opens, which matters most the first time a page opens after an update (the page and Boot.js are still checked for a newer copy then, as always, so updates show right away). The next page opens as soon as the last one is out of sight (85% of the way through its slide, which eases to a stop past the screen's edge) instead of at the slide's very end. A page that slid out but is still there after it was left (the link opened somewhere else, like a phone's window over an app, or never opened) comes back into view once it's back on the screen, or after 5 seconds, so the screen is never left with just the starfield. The server makes its tables once per Worker instance instead of on every request. Every change works out the whole budget again, so that work is kept small: each day's lines are read once and remembered by their text (readLine), so all of History isn't split up again on every change, and the Recurring page's Yearly counts each recurring cost's days with arithmetic (countRecurringHits) instead of checking every day to December 31. With over a year of History, a whole change takes a few milliseconds on a computer. Bob's page works out its cards only while it's open, and only the ones that are on; a change anywhere else only works out his message on Home. A budget with no % entries skips working them out, and one with them walks its days once per change. The sounds (Resources/Sounds/, small MP3s, about 230 KB together) are fetched at the first tap or key press, at their fingerprinted addresses, and the music's only once it starts.
ScriptWhat it does
Boot.jsPage detection, sign-in redirects, the front page or the budget at / (html.frontPage), which way the page slides in (from the note Layout.js left for it), loading scripts (at their fingerprinted addresses), the site version, this device's theme (html[data-theme], html.lightCards for a theme with dark words on light cards, and a Custom theme's five colors worked out into the page's colors: window.Themes), and Reduced Motion's switches (html.lessMotion, lessMotion(), stillStars(), window.Motion); another tab's change to either follows at once.
Sprites.jsShows the special emoji (the entry types, and In Bank, Gains, and Costs) as the site's own images on every page (see Sprites).
Layout.jsPage transitions (which way a page slides, slideWay, and a note in the tab's session storage so the next page slides in the same way; the next page, Boot.js, and the page's scripts are prefetched while the page slides out, and the next page opens once this one is out of sight; a tab for the page that's showing goes nowhere, and between the budget's four pages only the page under the tabs slides, while the tab's bright edge and dot slide to the tapped tab and the light inside fades from one tab into the other, so the tapped tab ends up just like the next page's), keeping a page at its top while it slides in, the screen layer (#screenLayer, window.ScreenLayer: floating boxes, the date picker, Search, and Help open on the part of the page on the screen, visualViewport, and the layer is pinned to the page while one is open, so the page scrolls and zooms with it, and a box longer than the page makes the page that much longer) and the note layer (#noteLayer, ScreenLayer.notes: notes, the idle countdown, and the version number, always on the screen), sending a Quick Entry icon's app back to Quick Entry, the back buttons (the menu pages' Back too), the floating cards (.isFloating: each card's own slow loop, while it's on the screen), the Steps for lists (.deviceGuide), floating Help, the footer, and signing out (it ends the session on the server, forgets the tab's Undo steps, keeps the device's own choices, like analytics off, its last passkey, and the day picked for the Equity window on Bob's page, and tells the login page not to try the passkey by itself). It also hides Logout while signed out.
Sounds.jsSound effects and music (Web Audio): which sound a tap gets (soundFor), the page transition's (Sounds.playTransition, from Layout.js), the music on the signed-in pages (a quiet bed of far-off twinkles every 1.4 to 3.2 seconds, softened, and clearer ones every 7 to 18), an iPhone's ambient audio session (it mixes with other audio), and the device's switches (Sounds.setMusic, Sounds.setEffects).
Session.jsSigns out after 15 minutes without activity (ending the session on the server too), with a counting-down notice in the last minute.
Budgets.jsWhich budget a signed-in page opens (this tab's, a reminder link's ?budget=, or the account's last: Budgets.query(), which every request about the budget carries), and the budget picker above the header's buttons: its list (each own budget with Share), Share's window and its people, New Budget, joining and declining invitations, opening another budget, and Settings' Budgets card (renderManager: Rename, Delete, and Leave too).
Login.jsThe login page's modes: sign in (password, passkey, passkey autofill, and the device's last passkey tried by itself: tryLastPasskey), create (with the birth date's calendar button), forgot, reset (from an emailed link), verify (an email verification link), the link that confirms one of the account's Other Emails, and the question about turning on passkey sign-in. It checks the username and password rules before sending.
Passkeys.jsPasskey helpers for the login page and Settings: whether the browser can use passkeys, what the device calls its check (like Face ID), turning the API's options and the device's answers into each other's formats, and the passkey the device last used (lastUsed, rememberLast, forgetLast; a sign-in request for just that one: signInRequest(options, only)).
Dates.jsDates on the login page and every budget page: making, stepping, storing, showing, and reading typed dates (in the device's format, or Settings'), and the date picker (DatePicker: the calendar button beside a date box, and the small calendar it opens, with its month and year boxes, whose lists pick with a tap, not a press, so a finger can scroll them).
Process Budget.jsThe budget engine: loading, the daily update, every change, Undo and Redo, the math, Bob's message and his page's settings (which cards are on, the wavelengths: wavelengthList, saveWavelengths, and each title's wavelength: purposeOf, noteEntryPurpose), paying a balance off (payOff, paymentToPayOffBy, and an account's own pace: accountPayoff), entries' notes (ENTRY NOTES: followEntryNote keeps one with its entry, dropStrayNotes lets one go with it), Upload A Backup (BACKUPS: readBackup, backupPlans, uploadBackup), the tracker, Search, Equity, connected spreadsheets' entries, the calculator, reminders, saving (with the revision check, retries, and the warning before leaving), and zooming days on Home's calendar and History (a tapped day, swiping to the next one, pinching one day, and the computer's magnifying), interest on Equity (accountInterest, worked out a day at a time by interestStepper) and the budget on any day ahead (projectBudget, which budgetAhead uses for In 6 Months), In Bank by day for Quick Entry, placeholders (deleted by the daily update once their day passes), % entries (resolvePercentEntries, percentRunner), goals, quick entries (this device's added as the budget loads, which names its icons: budgetLoadAddress; others' held for Home: holdQuickEntries, and picked up by Home's Add: addWaitingQuickEntry), History's changes that keep the balances (changeHistoryEntry, keepAccountBalances), new titles (renameEntry, canRenameEntry), an account's entries (accountEntryLines), Savings and Cash (MANDATORY_ACCOUNTS) and Max (accountMax), transfers from another account (splitAccount's from, withAccount, fromAccount), interest kept apart (interestBalance), the tracker's Interest row (interestAdded), the Change Logs' Undo (CHANGE LOG UNDO: changeRecord keeps what a change did with its row, undoLogRow takes it back), Bob's warnings (turnBobWarning, okayBobWarnings), the calculators' crystals, gems, and kept boxes (saveCalculatorPresets, saveDebtFields), live updates (liveCheck, loadInPlace), the open budget in every request (budgetQuery, withBudget, budgetIsGone), and what each person keeps up to date in a shared budget (readsConnection, keepsReadProblem).
Budget UI.jsShared pieces: floating panels (one can open over another: stacked), fields (amount, typed like a cash register: cashRegister, with its $ / % switch for an Equity account; date with its calendar button; refraction type; the Equity account picker, a dropdown with each balance on a second line, and a Transfer's From under it: accountField, dropdownList; the Placeholder switch with its Delete it after: placeholderField; buttons with a second line, like a goal's For: choiceList; the Wavelength buttons: purposeField; select boxes: selectField; frequency; title lists, with Search's Exact switches and the ? that explains its buttons), New Entry (openNewEntry, Home's button and a zoomed day's +), a note under a form's buttons (noteField), an entry's options (for Home, Upcoming, History, an account's panel, and Search: openEntryOptions), entry colors (amountClass), toasts.
Spreadsheets.jsConnected spreadsheets (on every budget page but Quick Entry): downloading one through the API, reading .xlsx, .ods, and .csv files (a small zip reader with the browser's DecompressionStream, and DOMParser), ranges (columns and rows to B2:B50), the entries a connection's cells make and what needs a look, and reading them again when Home or the Spreadsheets & Calendars page opens.
Calendar Page.jsThe home page: the Getting Started card, Quick Entries To Add, Bob's message (and his warnings, which move his card over the calendar: BOB'S WARNINGS), the calendar (drawing its days, its weekdays and months, and tapping an entry on a zoomed day), the buttons above it, the Lowest card (with the 28 days after the calendar, from the last day's lines, and red below $0), the search box and results, info row (Upcoming's entries open their options), Undo and Redo (buttons and shortcuts), Quick Entry setup.
Budget Search.jsHome's and History's Search: its titles, filters, and dates, its results (each opens its options, and one into the future ends with Go To Equity: goToEquity), and finding them again after every change (refreshSearchResults).
Budget Pages.jsRecurring Entries (fitting the screen, with titles cut short: clippedCell), History (its entries open their options), Equity (with the total, each account's interest, with its rate, compounding, and day: interestFields, and Max, and its entries in its panel: accountEntriesField), Tracker (fitting the screen, with its alias boxes), Paycheck Calculator (with its crystals), Debt Calculator (paymentCalculator, with an account's entries: paymentsEntries, and its gems; crystals and gems are one shelf: presetShelf), Change Logs (with its details boxes and each row's Undo).
Bob Page.jsBob's page: his highlights, each card's switch, Warnings switch, and ?, what the cards with Warnings on say for Home (bobWarnings, which Home loads this file for), Data (and the windows behind its rows), Accounts on any day ahead, Goals, Wavelength Planning (the spectrum: wavelengthSpectrum, each wavelength's titles, the titles not on one yet, and the Wavelengths window: openWavelengthsWindow), and his tips.
Spreadsheets Page.jsThe Spreadsheets & Calendars page: connected spreadsheets (the list, the Add Spreadsheet and ➕ boxes, the note until the email is verified, and the link to Other Emails in Settings).
Calendars.jsConnected calendars (on Home and the Spreadsheets & Calendars page): downloading one through the API, reading its iCalendar text (events, repeats with their exceptions, and time zones: the browser's own, Outlook's names, or the file's), its shifts and bonuses, paydays and pay periods, hours by workweek (overtime, double time, premium, paid time off), the blended rate, night pay, title rules, breaks, deductions, FICA, federal (the W-4 tables) and state taxes, the paychecks and their entries, and reading them again when Home or the page opens.
Calendars Page.jsThe Spreadsheets & Calendars page's calendars: the list, Add Calendar (the link, then the form: its paychecks, the pay with its versions and crystals, title rules, which events count, and what it finds), and Paychecks And Shifts (this year's totals, the schedule, and each paycheck with its shifts).
Settings Page.jsThe Budgets card (drawn by Budgets.js), reminders (the Daily Reminder card shows only while one is on, with Reminders are about), push notifications, calendar link, the theme (and Custom's window), sounds, and Reduced Motion on this device, email (and verifying it) and Other Emails, birth date, password (change it or email a reset link), passkeys, Quick Entry icons (and whether they show balances), Sign Out Everywhere, Download My Data, Upload A Backup (its window: openBackupPanel; the reading and merging are Process Budget.js's BACKUPS), analytics on this device, delete account.
Line Graph.jsThe line graph that goes in any window or page (Bob's Data windows, the top of the Debt Calculator): its date box, days ahead dashed, reading a day with the pointer or arrow keys, the legend, and See the numbers. Give it from and series (see its top).
Quick Icon.jsThe Quick Entry icon's picture: what this device keeps (prismal_quick_icon), drawing it from its colors and icon, reading an uploaded image, and putting it in Quick Entry's icon links.
Quick Entry.jsThe Quick Entry page: In Bank today and the lowest at its top (and alone on an Apple Watch), its form (New Entry, New Prism, or Change Entry), prisms, its Undo and Redo, its Waiting list, and its Help's Copy Link.
Starfield Setup.js, Active Starfield.js, Keyboard Starfield.jsThe animated starfield (it runs in a background worker that Boot.js starts early, and keys nudge the stars; each theme has its own stars and colors, drawn once on a small canvas, and on a light theme a dim star fades toward the page instead of black; Reduced Motion can hold it still; see The starfield background).
Analytics.jsGoogle Analytics (not on the Quick Entry page): skipped when the device turned it off or the browser sends Global Privacy Control or Do Not Track, and given page addresses without their ?query or #hash. Google Signals and ad personalization are off (the site shows no ads).
Debug.jsThe starfield settings on the Not Found page.
sw.jsThe service worker that shows push notifications (tapping one opens the budget).

Sprites

Sprites.js, on every page, swaps the special emoji for the images in Resources/Sprites/. The entry types: Regular.webp (❗️, a red circle with a white !), Hidden.webp (✖️, a purple circle with a white X), Transfer.webp (⭕️, a green circle with a white =), Recurring.webp (✔️, a blue ring, with nothing inside or around it), and Spreadsheet.webp (➕, a yellow plus). The lines the budget writes itself are triangles: InBank.webp (✅, green with a white check, pointing up), Negative.webp (⛔️, In Bank below $0: red with a white no sign, pointing down), Gains.webp (❇️, blue with a white plus, pointing up), and Costs.webp (✴️, orange with a white minus, pointing down). Each is a small square image (around 90×90) with a transparent background. It only changes what's shown: each image's alt text is its emoji, and the stored budget keeps the emoji. Anything added to the page later (a redrawn calendar, a panel, a toast, or a browser's translation) is swapped as it appears, and an image that can't load shows its emoji again. To change one, replace its file with art of the same name, then stamp the site.

Some text can't hold an image: the browser's own dialogs (like "Delete …?"), suggestion and select lists, and the text in boxes. Those show the device's own emoji in its own colors, so the site words those spots instead where a type would show: a tracker row that counts transfers is "Food (counts transfers)" in Search's suggestions and "the Food row (the one that counts transfers)" when deleting it, and a prism's type is a word ("(Hidden)") when deleting it. The daily reminders (push notifications and calendar events) are the device's too, so their ✔️ and ❗️ are the device's emoji.

For search engines, robots.txt points to sitemap.xml, which lists the public pages (the front page, this page, Login, and the Privacy Policy); the signed-in pages are left out, and the Quick Entry page keeps itself out with a noindex tag. The web app manifest (Favicon/site.webmanifest) makes an installed app open Home.

20. API Reference

The API is at https://prismal-budget-api.prismalbudget.workers.dev. Requests and replies are JSON. Signed-in routes need an Authorization: Bearer <token> header for a session that's still open. Routes that set a new password answer 400 when it breaks the rules or is known from data breaches. Too many tries answer 429 (wait a while, then try again), and an unexpected error is a 500. Routes about a budget (/api/data/*, /api/quick/key, /pickup, and /dismiss, and /api/notify/plan) take ?budget=: a budget's number, or last for the one the account opened last; without it, they're for the account's first budget. One the account doesn't own or hasn't joined (or that was deleted) is 404 { budgetGone: true }.

RouteSign-inWhat it does
POST /api/registerNoCreate an account: username (5 to 30 characters you can see), password (8 to 256 characters, not from data breaches), email, birthdate (YYYY-MM-DD, 18 to 120 years ago; under 18 is 403 { underAge: true }), agreedToTerms, turnstileToken (the answer from Cloudflare Turnstile's check; without one that passed, 400 { turnstile: true }). Emails the new account a link to verify its email, and says whether it went out (verificationSent).
POST /api/email/verifyNo{ token }: a verification link's code. Verifies the email it was sent to while that's still the account's email, and returns { success, username, email } (again for a second tap, until it expires); 400 { expired: true } when it expired, the email changed since, or it isn't a code.
POST /api/loginNo{ username, password }, where username can also be the account's email or one of its confirmed Other Emails; starts a session and returns its token, and passkeysOn (the account's passkey setting: true, false, or null while it's unset; the login page doesn't need it). 429 after too many wrong passwords.
POST /api/passkey/login/optionsNoA sign-in challenge for the browser, and the site's ID.
POST /api/passkey/loginNoThe device's signed answer: { id, response: { clientDataJSON, authenticatorData, signature, userHandle } } (base64url). Returns a token, like /api/login.
POST /api/password/forgotNoEmail a reset link to an account's email, or to one of its confirmed Other Emails (the one given).
POST /api/password/resetNoA reset link's token and a new password (also ends every session and turns passkey sign-in off, and when the link went to the account's email, verifies it).
POST /api/quick/checkKey{ key, today }: is a Quick Entry key still good: the username, how many entries are waiting (waiting, from every icon), the ones this key added (queued: [{ id, title, type, amount, date, placeholder, until, percent, joining }], oldest first; placeholder is there only when it's true, until only when a last day was picked for it, and percent only for a % entry; joining: a budget has picked it up, so it can't be changed or taken back anymore; every route below that adds, changes, or takes back an entry returns both again), the accounts with balances (accounts: [{ name, balance, max }], max null for none), In Bank (inBank: { today, lowest, lowestDate }, each null when it isn't known, or null before the budget has stored any days), the prisms, the name of the budget it adds to (budget, when the account has more than one; null otherwise), and whether the form asks for a Wavelength (purposes: Bob's Wavelength Planning card is on) with the wavelengths to pick from (wavelengths: [{ id, name }], in order, or null while it doesn't ask). With balances off in Settings, the accounts come without balances (balance: null, max: null) and inBank is null, here and in the routes below. today (YYYY-MM-DD, the page's own date, sent when an entry is added, changed, or taken back too) says what counts in the balances: the budget's changes still to come (coming, see How the data is stored) and the waiting entries, the ones dated then or earlier (except a placeholder whose last day is before then, which the budget will leave out; a transfer from another account leaves In Bank out); for In Bank, the stored day it reads, and the days the lowest is looked for (that day on). A key that doesn't work is 401 (on every Quick Entry route with a key), and one whose budget its account can't open anymore is 410 { budgetGone: true }.
POST /api/quick/entryKey{ key, entry, today }: add an entry to the waiting list: title, type (auto, regular, hidden, transfer), amount, date, placeholder: true for a placeholder (anything else is an ordinary entry), with until (YYYY-MM-DD) for its last day when one was picked (only with placeholder; 400 otherwise), and percent for a % entry (a number from −1000 to 1000, not 0, only on a Hidden or Transfer entry whose title has an Equity account; its amount is about what it comes to), purpose (none, or a wavelength's id, when one was picked), and note (its note, up to 20,000 characters). Returns how many are waiting (and this key's), the entry's id (for Undo and Change), and the accounts with balances and In Bank again.
POST /api/quick/changeKey{ key, id, entry, today }: change an entry this key added, while it's still waiting (Change in the Quick Entry page's Waiting list); entry is read like a new one (400 when it can't be). Returns how many are waiting (and this key's), the accounts with balances, and In Bank; 404 { joined: true } (with the waiting entries) once a budget has picked it up, or for another key's entry.
POST /api/quick/unqueueKey{ key, id, today }: take back an entry this key added, while it's still waiting (Undo, or × in the Waiting list, on the Quick Entry page). Returns how many are waiting (and this key's), the accounts with balances, and In Bank; 404 { joined: true } (with the waiting entries) once a budget has picked it up, or for another key's entry.
POST /api/quick/prismsKey{ key, prisms }: the account's prisms, in order, replacing the list (after every add, move, or delete). Each needs at least one of a title (up to 100 characters), an amount, a type, and an Equity account's name, and can have placeholder: true and a percent; up to 30. Returns the saved prisms; 400 when one can't be read.
GET /calendar/<code>.icsIts codeThe reminders calendar feed.
POST /api/logoutYesSign this device out (Logout and the idle sign-out call it).
GET /api/data/loadYesWhich budget it is (budget: { id, name, first, owned, owner, shared }: owner is its owner's username, and shared whether anyone has joined it), every table (connected spreadsheets and notes too), the last daily update date, the waiting quick entries, each with icon, the first 16 hex digits of the SHA-256 of the key that added it (so the device that made the icon adds its own entries), their quick_signature (like /api/data/revision's), and the budget's revision. ?icons= (comma-separated, up to 20) names the icons this device made or used: the load marks their entries as picked up (see /api/quick/change), and leaves the rest waiting on Home (every entry is marked when it names none).
POST /api/data/update-<table>YesSave one table whole (calendar, recurring, tracker, future, history, search, calculator, accounts, logs, sheets, notes): { data, revision, quickEntriesDone }. Returns the new revision, or 409 { conflict: true } without writing anything when revision is from an older copy.
GET /api/data/revisionYes{ revision, quick, shared }: the budget's current revision, whether anyone has joined it, and its waiting quick entries' signature (the first 16 hex digits of the SHA-256 of each one's id and what it holds, so a change shows too). Open pages ask every 5 seconds (and when they come back into view), and load the budget again when either changed (Live updates).
POST /api/data/save_dateYesSave the day the daily update is done through.
POST /api/sheets/readYes{ link }: a connected spreadsheet's file, downloaded from Google, Microsoft, or Dropbox (as a link anyone can open, or through [email protected] for whoever shared it with that account, by the account's email or one of its Other Emails), passed back as it is, with X-Sheet-Format (xlsx, ods, or csv), X-Sheet-Name (URI-encoded), and X-Sheet-Access (public or shared). 400 { error } when the link isn't from those sites (an Apple Numbers link says what to do instead), it isn't shared, or it isn't a spreadsheet; 403 { unverified: true } until the account's email is verified; 413 over 8 MB.
POST /api/calendars/readYes{ link }: a connected calendar, downloaded from its subscription link (webcal:// and http:// read as https://) and passed back as it is (text/calendar), for the page to work out its pay. 400 { error } when the link isn't a calendar on the internet, isn't shared anymore, or leads to a web page; 403 { unverified: true } until the account's email is verified; 413 over 8 MB; 429 after too many reads in an hour.
GET /api/sheets/emailsYesThe account's Other Emails: { emails: [{ email, verified }] }.
POST /api/sheets/emails/addYes{ email }: emails it a link that confirms it (for one that's waiting, a new link), and returns the list with sent (the address), or with alreadyVerified: true. 400 for the account's own email, [email protected], a sixth one, or what isn't an email; 403 { unverified: true } until the account's email is verified; 429 when a link just went to that address, or after many in a day; 503 when emails aren't set up.
POST /api/sheets/emails/removeYes{ email }: takes it off (its spreadsheets aren't read for the account anymore, and its link stops working), and returns the list.
POST /api/sheets/emails/verifyNo{ token }: the code in that link. Confirms the email for the account that added it, and returns { success, username, email } (again for a second tap, until it expires); 400 { expired: true } when it expired, a newer link went out, the email was removed, or it isn't a code.
GET /api/accountYesUsername, email, whether it's verified (emailVerified), birth date and age (birthdate, age), whether emails can be sent, how many Quick Entry icons work (quickIcons), and whether they show balances (quickBalances).
POST /api/account/quick-balancesYes{ on }: whether Quick Entry icons show In Bank and the Equity accounts' balances. Returns the account, like GET /api/account.
POST /api/account/birthdateYes{ birthdate }: fix the account's birth date, like one typed wrong when signing up (18 to 120 years ago). Returns the account, like GET /api/account.
POST /api/account/emailYesChange the email (needs the password). The new one isn't verified until its link is opened: returns the account and verificationSent. 409 when another account uses it.
POST /api/account/verify-emailYesEmail a new link that verifies the account's email. Returns the account and sent (or alreadyVerified); 429 when one was just sent; 503 without email set up.
POST /api/account/passwordYes{ password, newPassword }: a new password. Signs out every other device and stops Quick Entry icons; returns a new token for this device.
POST /api/account/password-resetYesEmail a reset link.
POST /api/account/sign-out-everywhereYesSign out every device (this one too) and stop Quick Entry icons.
GET /api/account/exportYesDownload My Data: the account (with its Other Emails), every budget it owns, each table as data, not JSON text (its first as budget, the rest as otherBudgets, each with its name), who each is shared with and the budgets shared with it (sharing), reminders (and the budget they're about), Quick Entry icons (and whether they show balances), waiting entries, and prisms, passkeys, and signed-in sessions (when each started and ends), with no secrets.
POST /api/account/deleteYesDelete the account and its data, the budgets it owns included, for everyone they're shared with (needs the password).
GET /api/passkey/listYesWhether passkey sign-in is on, the account's passkeys, and its passkey ID.
POST /api/passkey/add/optionsYesCheck the password; returns what the browser needs to make a passkey.
POST /api/passkey/addYesSave the device's new passkey and its name, and turn passkey sign-in on.
POST /api/passkey/removeYesRemove a passkey.
POST /api/passkey/turnYesTurn passkey sign-in on or off ({ on }).
POST /api/quick/keyYesMake a Quick Entry key, for the budget the request names.
POST /api/quick/pickupYes{ ids }: Home's Add for entries another device's icon added. Marks them as picked up, so their icon can't change them while they're added, and returns { entries } as they are now (like the load's; one its icon took back isn't there).
POST /api/quick/dismissYesDrop waiting quick entries that couldn't be added.
POST /api/quick/offYesTurn off every Quick Entry icon (entries already waiting are still added).
GET / POST /api/notify/settingsYesReminder time and time zone (and budget, the one they're about, null for the account's first).
POST /api/notify/planYesThe days of the budget the request names that need a reminder, kept for every account whose reminders are about it.
POST /api/notify/budgetYes{ budget }: the budget the account's reminders are about (one it owns or joined); its days come with the next plan sent from it. Returns the settings.
GET /api/budgetsYesThe account's budgets: { current, budgets, invitations }. budgets: its own (its first one first), then the ones it joined, each { id, name, first, owned, owner, people }; people, for one of its own, is everyone it's shared with or invited to it ({ id, name, joined }, where name is what was typed until they join, then their username), and for one shared with it, the owner and everyone else who joined ({ name, owner }). invitations: [{ id, name, owner }]. current: the budget ?budget=last opens. Every route below answers with the list too.
POST /api/budgets/newYes{ name } (1 to 30 characters you can see): a new, empty budget of its own, returned as made. 400 past 10.
POST /api/budgets/openYes{ budget }: the budget ?budget=last opens from now on.
POST /api/budgets/rename, /deleteYes{ budget, name } or { budget }: rename or delete one of its own (403 for anyone but its owner; a first budget can't be deleted, 400).
POST /api/budgets/shareYes{ budget, to }: invite the account with that username or email to one of its own (403 for anyone but its owner). Returns the list with invited (as it will show), or already (invited or joined); 404 when no account has it, 400 for its own account or past the limits.
POST /api/budgets/unshareYes{ budget, person }: stop sharing one of its own with someone (person: the id in its people), or take back their invitation.
POST /api/budgets/join, /decline, /leaveYes{ budget }: join an invitation, decline it, or leave a budget shared with the account.
POST /api/notify/push/subscribe, /unsubscribe, /testYesPush notifications for a device: turn them on (with the browser's push subscription), turn them off, or send a test.
POST /api/notify/calendarYesTurn the calendar link on, make a new one, or turn it off.

21. Why It Works This Way

  • A calendar instead of categories first: knowing which day the balance dips is what keeps you from overdrafting; the tracker covers categories.
  • Entries are lines of text: it's easy to read and store, and a day's whole story is in one cell.
  • Refraction types: not every dollar that moves is spending. Hidden covers money outside the budget's account; Transfer covers money that only changes places.
  • One entry per title and type per day, one recurring entry per title, type, and Equity account, one tracker row per title and transfer setting: there's never a question of which one a change, a temp, or a search means.
  • Temps and blockers: changing one day of a recurring entry shouldn't change every day, and days that passed should never change.
  • Accounts are linked through the entry's title: the account picked is kept after it ("Payday → Savings"), and the one a transfer comes from before that ("Move ← Savings → HSA"), so there's no extra field to keep in sync, and moving, combining, or deleting an entry, or a recurring entry landing, carries the link along by itself. Only a picked account links, never a title that happens to be an account's name. A balance is a starting amount plus those entries, so typing in what's already in an account never makes up an entry (or a gain) that didn't happen.
  • Budget math in the browser: changes feel instant, the server stays simple and cheap, and the math lives in one place.
  • Whole tables saved at once, with a snapshot before every change: a change either fully happens or doesn't happen at all.
  • The Quick Entry key can only add: a phone left unlocked can't be used to read the budget (just In Bank today, the lowest ahead, and the Equity accounts' balances). Its prisms are only what the person saved there.
  • Quick Entry's balances from what the budget leaves for it: the icon can't open the budget, so each time the budget is worked out it leaves each account's changes still to come next to its balances, and In Bank on each day ahead, and the page counts the ones whose day has come. So the page shows what the budget will say once it's opened, without seeing anything else in it.
  • Prisms kept with the account, not the phone: a new icon (after a password change, say) or another phone has the same ones, and a phone's home screen apps can lose what they keep in the browser.
  • Passkeys next to the password, not instead of it: a lost or replaced phone never locks anyone out, and the emailed reset link stays the way back in. Passkeys can't be phished or reused on another site, and nothing about a face or fingerprint ever reaches the server.
  • Passkeys only when asked for: signing in with a password never stops to ask about passkeys unless the switch was on, and skipping one never turns passkey sign-in off for the account (only Settings does).
  • A revision check instead of "last save wins": each table is saved whole, so a page holding an older copy (another device, or a tab left open) could quietly erase changes made elsewhere. Refusing that save and reloading costs one redo at worst, and never loses data.
  • A starting balance as an ordinary entry: it shows on the calendar and can be changed or deleted like anything else, instead of being a hidden number. A Transfer changes In Bank without counting as income.
  • Usernames with any characters you can see, but no invisible ones: people can use their name in any language, or an emoji. Characters you can't see, or that flip which way text runs, could make two different usernames look the same, so they're refused, and look-alike forms count as the same username.
  • Length and a breach check instead of "one number and one symbol": rules like that make passwords harder to remember without making them much harder to guess. Refusing passwords attackers already have on their lists does more, and any characters (even a whole sentence) are welcome.
  • Undo by day, and only while the day still matches: each part of the budget is saved whole, so putting back an old copy of a whole table could erase changes made since. Putting back only the entries on the days a change touched, and only while those days are as it left them, can't.
  • Analytics with the private parts left out: page addresses without their ?query, nothing about the budget, none of Google's advertising features, and off for anyone whose browser asks or who turns it off.
  • Floating boxes: the page never jumps around while you work.
  • Floating boxes and zoomed days are part of the page once they're open: a box kept on the screen at its own size couldn't be zoomed in on to read, or scrolled to when it was taller than the screen. Opening where the screen is, then moving and zooming with the page, gives both: it's in sight when it opens, and the page's own zoom and scroll work on it.
  • Live updates by asking every few seconds: a page asks the server whether the budget changed (one small request) instead of keeping a connection open, which needs nothing more on the server and stops by itself when the page is off the screen. Loading the budget again in place, and only while nothing's being changed here, means another device's change never lands in the middle of yours.
  • Titles from today on stay with what lands them: a recurring entry or a connected spreadsheet writes its title on each day it lands, so a new title on one day would let it land there again next to the renamed one. Days that passed can't be landed on anymore, so any entry there can be renamed.
  • Wavelengths without a set split: Needs, Wants, and Future are only where they start. A budget names its own (1 to 10) and sees where its money goes, with no share any of them is expected to get, since what fits one budget doesn't fit another.
  • The Equity account picker as a dropdown: a budget with several accounts would fill a form with their buttons, so they fold into one box, and each still shows its balance under its name, which a browser's own select box can't.
  • Savings and Cash in every budget: most people keep both outside their bank account, so they're ready to pick for a transfer or for spending cash (a Hidden entry), without setting them up first.
  • Hidden entries change an account by their own amount, Transfers by the opposite: a Transfer is one movement seen from two sides (out of In Bank and into savings), while a Hidden entry happens in the other account itself, so its sign already says what happened there.
  • Temps let go when their recurring entry ends: a temp only keeps its recurring entry from landing on its day, so once the recurring entry can't land there anymore, the temp is just an entry.
  • Days stored as text, the same way everywhere: a budget day is a calendar day, not a moment in time, so a time zone or a date format can never move an entry. Only what's shown and typed follows the person's format.
  • The browser's translation instead of translated pages: every major browser can translate a page, on the person's own device and into their language, and it keeps up with every change to the site with nothing to maintain. Keeping the person's entries, names, amounts, and dates out of it means their budget never changes under them.
  • Connected spreadsheets work like recurring entries: they're written from today on and taken off and written again with every change, so a spreadsheet that changes or drops an entry changes the calendar, while a day changed here (a temp) and days that passed never change under you.
  • The server downloads a spreadsheet, and the browser reads it: the page can't fetch other sites itself, but reading a file takes work, and the budget's other work already runs in the browser. The server just passes the file along, never keeping it, so it costs little and holds nothing.
  • Shared with [email protected] only for whoever shared it: Prismal Planning's Google account can open everything shared with it, so a link alone is never enough: the spreadsheet is only read for the account whose verified email (or a confirmed Other Email) owns or shared it. An Other Email is confirmed the same way as the account's email, by opening a link sent to it, so an account can only add an email whose inbox it can open.
  • A verified email for spreadsheets and Other Emails, and only for them: that match only means something when the account's email is really its owner's, so connecting and reading spreadsheets wait for a verified email, and so does adding Other Emails (which connect spreadsheets too). Nothing else does (signing in, the budget, and reset links work the same), so an email typed wrong never locks anyone out of their budget.
  • A zoomed day laid out big instead of scaled up: a phone draws a scaled-up element from its small picture, so a tiny day scaled to fill the screen came out blurry. Laying it out at the zoomed size draws its text at full size, and the scale only runs during the quick grow and shrink.
  • A phone's zoomed day scrolls in an area as big as the screen: a box that scrolls cuts off whatever goes past its edges, so a day that scrolled by itself couldn't show its lines past it. Its content covers the whole screen instead, and draws the day inside it, so a day with more lines than fit scrolls them together with the day.
  • Every day zooms to the same size: when a day zoomed less to fit its widest entry, one day came out bigger or smaller than the next, and a day with a long title had small text. One size for every day keeps the text easy to read and swiping from day to day steady; a title too long for the day ends in "...", and its options show it whole.
  • A Catchup keeps the past as it was: a Catchup says what the bank really had on a day, so whatever really happened before it is already counted. Fixing a typo or a wrong amount on a day before it shouldn't change In Bank. After the last Catchup, nothing has been checked against the bank yet, so a change there counts, the same as one on any day still to come.
  • The site's own date picker: each device's own looked different, and some only scroll through dates, so a birth date took a long time to reach. The site's matches the calendar, has a month box and a year box to type in, and the date box still takes a typed date.
  • The last passkey tried by itself, except after signing out on purpose: most sign-ins on a device are its owner coming back, so asking for that passkey right away saves a step. Logout (or Sign Out Everywhere) often means someone else is about to sign in, so then the page waits.
  • Placeholders are deleted when their day passes, not kept: a placeholder is a guess about a day still to come. Once the day is over, what really happened is what belongs in the budget (and History), so the guess goes, and In Bank from that day on follows without it. A last day picked for it is for a guess that settles sooner or later (like a bill that posts a few days after its day, or an estimate that the real bill replaces a few days before): it's still deleted, only then, from History too. Until then, it counts like any entry, so the days ahead show the money it stands for.
  • Two entries that become one are a placeholder only if both were: otherwise a real amount added into a placeholder (or a placeholder landing on a real entry) would be deleted along with it, and real money would vanish from the budget.
  • A placeholder is a mark on its emoji: keeping it as a ⏳ at the end of the entry's emoji (with its last day after it, when one was picked) means it moves, combines, and is saved with the entry with nothing extra to keep in step, and every rule that reads an entry's type and mark reads it the same way.
  • Equity look 6 months ahead: the calendar's last day is never more than four weeks off, which says little about a savings goal or a card being paid down. Six months counts what's coming the way the daily update will fill those days in, recurring entries and spreadsheets too.
  • A % entry works from the balance as its day starts: every entry on a day then works from the same number, whatever order they're in, so two % entries on one day never depend on each other, and the next day's start from what that day left.
  • A % entry stays what it came to once its day passes, and merging makes a plain amount: a day that happened shouldn't change because a balance changed later, and two entries that became one have no single percent to keep.
  • A % goal is fixed when it's set: a goal that moved with the balance it's measured against could never be reached.
  • Quick entries from another device wait on Home: on a shared budget, the other person sees what was added and decides, while a device's own icon (its owner's own entries) still adds by itself.
  • Sounds mix with other audio, and pick up again after an interruption: on an iPhone, the page's ambient audio session never stops the person's own audio, so there's no need to stay silent for the rest of a visit after something (like a call) takes the speaker; the next tap plays them again.
  • An account's first budget stays where its budget always was: nothing had to move when an account could have more than one, and every other budget's key is a negative number, which can never be an account's. A request that doesn't name a budget means the first one, so a page left open from before can never save into another budget.
  • Sharing is the owner's, and joining is the other person's: a budget holds someone's money plans, so only its owner decides who sees it, and nobody it's shared with can pass it on. Nothing lands in an account's list until that person says yes, so nobody can fill someone else's list with budgets.
  • Someone invited by email shows as that email until they join: the owner already knows the email they typed, and seeing whose username it is waits until that person agrees.
  • Each tab keeps its own budget: picking a budget in one tab never changes where another tab's changes are saved, so two budgets can be open side by side and each change lands in the one it was made in.
  • Fingerprinted files instead of a reload per release: pages are always fresh, so they always point at exactly the right files, and a release only downloads again the files that changed.

22. Notes For Developers

  • The engine is Javascript/Process Budget.js. The page calls these, and each runs through runBudgetAction (queued, snapshot and rollback, refresh, log, save, then a budget:updated event): addCalendarEntry, changeCalendarEntry, saveRecurringEntry, saveTrackerEntry, saveAccount, moveBudgetRows, addCategoryRow, renameCategoryRow, deleteBudgetRows, searchBudget, savePaycheck, and for connected spreadsheets saveSheetConnection, turnSheetConnection, deleteSheetConnection, and updateSheetReads. Results look like { ok, saved, notFound, message }; a BudgetInputError becomes a message for the person instead of an error.
  • refreshBudgetData rebuilds everything computed, in order: frequencies rewritten the new way, Upcoming moved onto the calendar, recurring entries written, connected spreadsheets' entries written (writeSheetEntries), temps let go (releaseEndedTemps, releaseSheetTemps), expired recurring entries removed, each day's entries combined and sorted, % entries worked out (resolvePercentEntries), In Bank and the 28-day lines, Bob's message, the tracker and the recurring summary, then account balances.
  • Rules to keep: one entry per title and refraction type per day; one recurring entry per title (its Equity account included) and refraction type (refuseRecurringTwin, and refuseRecurringClash when an account is renamed; recurringDuplicates finds any that slipped in); one tracker row per title and transfer setting; an entry is for an Equity account when it's Hidden or Transfer and its title ends with " → " and the account's name (splitAccount, withAccount; a title that's only the account's name doesn't count), and the account changes by accountChange (a Transfer the opposite of its amount, a Hidden entry its own; the API's readAccounts in src/quick.js has to match it, and adds the changes accountChangesAhead stores in the accounts table's coming once their day comes); Hidden entries are costs and gains (the day's lines, the tracker, Search) but never change In Bank, and transfers change In Bank but aren't costs or gains (dayMath, isTransferEntry); titles compare with cleanString (lowercase letters and numbers in any language, and single spaces; symbols only when there are no letters or numbers; the invisible "show as emoji" variation selectors are dropped first, so "⭕️Food" compares as "food"), and the API's cleanTitle in src/quick.js has to match it. Typed amounts go through readMoneyInput (which reads a decimal comma).
  • Frequencies parse with parseFrequency and are written with formatFrequency; a recurring entry lands when recurringRowHits says so.
  • Lookups keyed by titles use Map, or check that the key is the object's own (like each title's purpose and the notes), so a title like "constructor" is just a title.
  • Passkeys are Javascript/Passkeys.js (with Login.js and Settings Page.js) on the site and src/passkey.js in the API. Browsers only allow passkeys on a web address, so test at http://localhost:…, not 127.0.0.1; passkeys made there only work there.
  • Budgets: Javascript/Budgets.js on the site (loaded on every signed-in page, before Process Budget.js) and src/budgets.js in the API (budgetFor resolves ?budget=, budgetKey is where a budget's rows are kept, and letGo is everything that goes when someone can't open a budget anymore). budgetApi adds the open budget to every route in BUDGET_ROUTES; a request about a budget written outside it needs withBudget. Something kept per budget in the browser (like Undo's steps or the reminder plan last sent) needs the budget in its key.
  • Saves go through saveChanges, which sends the page's dataRevision with each table and takes the new one back. A 409 sets budgetConflict, stops the rest of the saves, and reloads with a notice. Test stand-ins for D1 must report meta.changes like D1 does, since the API checks the revision update's meta.changes.
  • Security details (the server's secrets, its limits, and how each defense works) stay out of this public page. They're in SECURITY-NOTES.md, in the API's private repository; update it there when a change touches security.
  • Accounts are src/account.js and src/passwords.js in the API. Login.js and Settings Page.js check the username and password rules before sending, and the API checks them again, so keep them in step.
  • Undo: a change that should be undoable passes { label, dates } as runBudgetAction's third argument (see addCalendarEntry, changeCalendarEntry, and holdQuickEntries). undoCalendarChange and redoCalendarChange take a step, and undoInfo() says what each button would do.
  • History changes: changeHistoryEntry (only for a day before the calendar that History has) makes the change with the same helpers as the calendar's, and returns an afterRefresh that processBudgetAction runs once everything is worked out again: keepAccountBalances puts each Equity account's balance today back to what it was (accountBalancesToday, taken before the change) by moving its starting amount. The calendar's In Bank starts from History's last In Bank line, which isn't worked out again, so In Bank stays by itself. Its undo step is marked keepBalances, so undoing and redoing it keep them too.
  • Things that float (panels, the date picker, Help, the search boxes) go in #screenLayer (Layout.js), a layer moved and scaled to the visual viewport while it's empty; a MutationObserver pins it to the page (.isPinned, position: absolute at the visual viewport's page position) while anything in it shows, so they open at their own size where the screen is, then scroll and zoom with the page. Notes, the idle countdown, and the version number go in ScreenLayer.notes (#noteLayer), which always follows the screen. Place things with ScreenLayer.rectOf(element) (an element's box in the layer's own pixels, from where the layer is now) and their own size from offsetWidth and offsetHeight (their box on the screen is small while they zoom open), and re-place them on ScreenLayer.onChange (only while the layer follows the screen).
  • Test stand-ins for D1 must also return meta.last_row_id (a queued quick entry's id). Tests against wrangler dev reach the real Have I Been Pwned, so their passwords can't be common ones.
  • Requests to the API with the login token go through budgetApi; a 401 means the session ended, and signedOutElsewhere signs the page out. Saving stops after a 401 or a 409.
  • Images: the icons (the header buttons', the tabs', Undo, Redo, Search, Quick Entry, the cards', and New Entry's prism, in Resources/Icons/) and the sprites (Resources/Sprites/) are small WebP files, each cut out of a drawn sheet at its own size with a transparent background; to change one, replace its file with one of the same name. Bob's picture is Bob.webp (384×384, what Home and his page show), made from the full-size Bob.jpg, and the logo is Prismal.webp, a small copy of Prismal.png. After changing an image, stamp the site (below).
  • Dates: the helpers below are in Javascript/Dates.js (loaded before Process Budget.js on budget pages, and before Login.js on the login page), with the date picker (DatePicker.button(input, { label, min, max, today }) makes a box's calendar button; picking a day writes it with showDate and sends the box input and change events, so a box reads the same picked or typed). Tables store MM/DD/YYYY (written with formatToMMDDYYYY and formatToMMDD, read with createSafeMidnight). People see showDate, showDay, or showStoredDate, and what they type goes through parseTypedDate (with datePattern() as the box's hint; month names go through namedDate, so no browser's own guessing is used, and digits alone through splitDigits; a birth date passes { pastYears: true }, to it and to its DatePicker.button), all following dateFormat(). Never show a stored date as it is, and never read a typed one with createSafeMidnight. Step days with addDays, never by adding 86,400,000 ms. pageDay is the device's date when the page loaded; today is the budget's, set by setBudgetDay (see Dates).
  • Zooming a day is in Process Budget.js's LAYOUT FUNCTIONS (wireElasticTable, zoomDay, fitZoomedDay, closeZoomedDay), for any .elastic-table: Home's calendar is wired as the script loads, and History's table (.elastic-table.historyGrid) each time Budget Pages.js draws it (a day zoomed then is zoomed again in the new table, without the grow). Two fingers on one day pinch, stretch, turn, and move just that day, which settles back when they let go; two that start on different days, off the days, or on a zoomed day zoom the page itself, like anywhere else on it. Lines never wrap (white-space: nowrap). On a computer, CSS scales the day 2× (--zoom: 2, which the round buttons divide by to stay the same size), and keepDoubledDayOnScreen adds a translateX when its widest line would run off the window. On phones, fitZoomedDay measures the day at its own size (--zoom: 1, with nothing drawn in between), sets --zoom so it's ZOOM_WIDTH_SHARE (0.92) of the screen's width, up to ZOOM_MAX_WIDTH (560) pixels, the same for every day, and --zoomText so its text is ZOOM_TEXT_SHARE (0.82) of what that zoom would make it, from ZOOM_TEXT_MIN (15) to ZOOM_TEXT_MAX (19) pixels. Its height is its lines' (measured at that size), at least ZOOM_MIN_HEIGHT_SHARE (0.3) of its width, centered on the screen; one taller than the screen starts ZOOM_EDGE_SHARE (0.04) of the screen's height from its top and runs past its bottom, and the page scrolls to the rest. It moves there with a translate only: its content, laid out at --zoomText times its padding and font size, becomes an area as big as the screen, or as tall as the day when that's taller (--viewW by --viewH; it never scrolls by itself, the page does), and its ::before draws the day at --dayX, --dayY, --dayW by --dayH (with its corners, colors, and the × at its corner: --DAY_BUTTON_SPOT and --DAY_BUTTON_SIZE in budgetStyle.css), so its text is drawn at full size; each line ends in "..." at the day's edge. It's placed where the screen was when it zoomed in (zoomAnchor, in page pixels, kept while sliding to the next day and when History draws its days again), so the page can be scrolled and pinch-zoomed with it (html.dayZoomed is only a mark); a window that changes size places it again. Two fingers on a zoomed day zoom the page, not the day. A tap on that area beside the day closes it (missesZoomedDay). A scale only runs in the Web Animations that grow it out of the day and shrink it back (dayInPlace, which follows the area's scroll; isZoomClosing while it shrinks). The dimming backdrop sits in #transitionContainer, just under the day, on computers too. A finger sliding a phone's zoomed day sideways moves it once it has gone DAY_DRAG_START_PX (followDaySwipe; only DAY_DRAG_STRETCH of the way with no day that way), and letting go either slides on from there (slideToDay's dragged) or settles it back (settleDraggedDay). A day tapped while the page is pinch-zoomed in (pageZoomedIn) waits for unzoomPage, which gives the viewport tag maximum-scale=1 for a moment (a browser that honors it, like Chrome on Android, zooms the page back out); a page still zoomed in after that gets its zoomed day laid out for the page's own size, across the page, with its middle where the middle of the screen is, so it zooms with the page and pinching back out shows all of it. Its round buttons are .cell-action-btn: .cellAdd (+, BudgetUI.openNewEntry with the day's date) and .cellClose (v).
  • Change Logs timing: runBudgetAction notes when a change was asked for, and processBudgetAction draws the change (budget:updated), waits for the next paint (afterNextPaint), then finishes the log row and saves.
  • A change runs after stripRecurringEntries has taken the recurring entries off the calendar, and gets the tables as they were before (change(before), from snapshotTables). Search reads that calendar, so it finds the recurring entries the calendar shows.
  • The starfield measures its canvas (STARFIELD.canvasBox) for its size and for where a tap lands, never innerWidth/innerHeight, which Safari shrinks while pinch-zoomed.
  • Translation: an element that shows the person's entries, names, amounts, or dates gets translate="no" (BudgetUI.noTranslate); the site's own words don't.
  • Temps: releaseEndedTemps (in refreshBudgetData, before expired recurring entries are removed) turns temps after their recurring entry's last day, from today on, into plain entries, and releaseSheetTemps does the same for spreadsheet temps whose title and type no connected spreadsheet has anymore.
  • Marks: a sprite's entryMark says where an entry comes from: ✔️ a recurring entry, ➕ a connected spreadsheet, or none. Before the type it's still as it landed (✔️⭕️, ➕❗️); after it, it's a temp (⭕️✔️, ❗️➕). unique() finds what lands on a day by itself with scheduledHit (a recurring entry first, then a spreadsheet's, sheetHit), and keeps that entry's mark on the temps and $0.00 blockers it makes. A spreadsheet's entries by day come from sheetEntriesByDay (only spreadsheets that are on, without the ones a recurring entry keeps off), which the daily update, the 28-day lines, Search, reminders, and Bob's page all use.
  • Placeholders: PLACEHOLDER_MARK (⏳) ends a placeholder's sprite, after its type and mark, so getSpecialType and entryMark read it as always. A last day picked for it follows the mark (PLACEHOLDER_PART: ⏳YYYY-MM-DD, or ⏳+N or ⏳-N on a recurring entry, which placeholderEnds counts from each day it lands on; a recurring entry's ⏳-N doesn't land on the days just ahead at all, parseRecurringRow's goneUntil, which recurringRowHits and countRecurringHits read); placeholderExpired(sprite, date) says whether one is due to go, and mergedPlaceholder keeps the one already there's part when two become one. Use isPlaceholder, withoutPlaceholder, and placeholderSprite(sprite, placeholder) (true keeps the sprite's own part, a part string sets it) to read and write it (and baseSprite to compare kinds of entries), and shownLine for a line as it's shown (without the mark; the page adds the isPlaceholder class, which is yellow). unique() takes placeholder (true, false, or left out to keep the entry's) and adding (a new entry: added into an entry already there, it's a placeholder only if both are), and injectOrDefer writes what writtenPlaceholder says (moved onto a day that passed, one whose last day was its own day, or counted from it, is an ordinary entry; a picked last day stays even once it's passed, for the next load to delete). Anywhere two lines become one (combineSameEntries, combineSameUpcoming, writeRecurring, writeRecurringToCell, writeSheetsToCell, sheetEntriesByDay, a move in unique()), the result is a placeholder only if both were. The daily update takes them off each passed day with dropPlaceholders (before turning that day's entries into temps; only the expired ones), off History with dropHistoryPlaceholders, and off the calendar's days from today on and Upcoming with dropEarlyPlaceholders (the ones whose last day passed before their own day; after the used Upcoming rows are taken out), and works In Bank out again from the first day that lost one (rechain); setDayEntries leaves out expired ones, so Undo can't bring one back; holdQuickEntries leaves out a waiting one whose last day passed (quickPlaceholderPassed). A connected spreadsheet's placeholder marks every entry it adds, and the API keeps placeholder: true on waiting entries and prisms (readEntry, readPrism in src/quick.js), and until with it, and readBalances leaves out a waiting one whose last day is before the page's day.
  • % entries: PERCENT_MARK (%) and the signed percent sit after the type and mark, before ⏳; read them with percentOf, and write them with decoratedSprite(base, { placeholder, percent }), percentSprite, or rebasedSprite (a new type and mark, keeping both). baseSprite is a sprite without either, and plainLine a line with only its type and mark (for sorting). resolvePercentEntries (in refreshBudgetData, after the entries are sorted and before the math) walks the accounts' balances from today through six months ahead with percentRunner, rewrites the calendar's % amounts and Upcoming's, and keeps each day's starting balances in percentBases, which landingAmount and percentAmount use for what lands by itself (recurring entries, spreadsheets, the 28 days after the calendar, Search). unique() takes percent (a number, null for a plain amount, or left out to keep one that's only moved); injectOrDefer's set keeps the incoming percent; anything that merges two lines makes a plain amount. The daily update freezes them (performDailyUpdate), working out new days' with a percentRunner from accountBalancesToday.
  • Goals: saveGoal and deleteGoal (goalEntry, removeGoal, goalBalance) keep accountsData.goals; a change runs with the calendar's In Bank lines taken off, so a % goal reads In Bank from the calendar as it was before the change.
  • Sounds: _tools/make-sounds.mjs makes every file in Resources/Sounds/ from code (tones, reverb, and noise, from a fixed seed, so they come out the same each time), as MP3s through the @breezystack/lamejs encoder (cd _tools && npm install --no-save @breezystack/lamejs, then node _tools/make-sounds.mjs Resources/Sounds, and stamp the site). How loud each kind plays is in Sounds.js (VOLUMES, MASTER_VOLUME).
  • The Privacy Policy & Terms of Use page's <meta name="policy-version"> (its Effective Date, YYYY-MM-DD) and <meta name="policy-changes"> (a sentence or two on what changed) are what accounts are emailed about (the API's src/policy.js): change both along with the Effective Date whenever the policy changes, and only then.
  • Connected spreadsheets: the API's src/sheets.js downloads (readLink says what a link is, and fileFormat what the file is), and the site's Spreadsheets.js reads (readWorkbook, readConnection). Each connection's entries are read once into dates and compared titles (parsedSheetEntries, kept until its entries change). Test files for .xlsx and .ods can be made by hand: a zip of a few XML files is enough.
  • Connected calendars: the API's src/calendars.js downloads (readCalendarLink says what a link is), and the site's Calendars.js reads and works out the pay: parseCalendar, eventsBetween (repeats are counted only across the days being worked out), and workOut (shifts, pay periods, splitHours for the overtime limits, then each paycheck's taxes). It runs without a page too, so its math can be checked against a payroll's numbers by feeding it a calendar file and settings. Federal and state tables are data (FEDERAL_TABLES by year, STATE_TABLES by state): a new year's or another state's tables go there.
  • Verified emails: src/account.js sends the links (emailVerifyLink, with kind new, changed, or again) and checks them (handleVerifyEmail, POST /api/email/verify), and src/sheets.js checks that the email is verified first. Other Emails are in src/sheets.js too (handleSheetEmailsRoute sends their links, handleSheetEmailVerify checks them, and readShared accepts the confirmed ones), and their links open /login.html?sheet-email=. Tests add verification links to the database themselves (see test/index.spec.js), since they never send email.
  • Prismal Planning's Google account ([email protected], for spreadsheets shared with it: the site's Google Workspace account, which also gets the site's mail in its own Workspace inbox) needs three Worker secrets, made once while signed in to that account: in the Google Cloud console, make a project, turn on the Google Drive API, set up the OAuth consent screen (External, published to production, so its permission doesn't run out after 7 days) with the scope https://www.googleapis.com/auth/drive.readonly, and make an OAuth client (Desktop app). Then open Google's consent page for that client (scope drive.readonly, offline access, a loopback redirect address like http://127.0.0.1:8765, and PKCE), sign in as [email protected], allow it, and exchange the code for tokens. (A Web application client works too, with https://developers.google.com/oauthplayground as its redirect address and the OAuth 2.0 Playground's own-credentials option in its ⚙ menu.) Save them with npx wrangler secret put GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, and GOOGLE_REFRESH_TOKEN. Google drops the permission if it goes unused for six months or if admin@ removes the app's access; make it again the same way. Without them, spreadsheets shared by link still work.
  • Create Account's check that you're a person is a Cloudflare Turnstile widget (Managed, for prismalplanning.org). Its script loads once the page has (so a page opened as Create Account doesn't wait on it to slide in). Its site key is in Login.js (TURNSTILE_SITE_KEY), and its secret key is the Worker secret TURNSTILE_SECRET_KEY (npx wrangler secret put TURNSTILE_SECRET_KEY). Anywhere but prismalplanning.org the page uses Cloudflare's test site key, which always passes; a copy of the API given Cloudflare's test secret (1x0000000000000000000000000000000AA) accepts its answer (XXXX.DUMMY.TOKEN.XXXX), and one without a secret doesn't check sign-ups at all.
  • Releasing: change SITE_VERSION in Boot.js (the name in the corner, and in this page's "Last updated"), run node _tools/stamp.mjs to update every fingerprint, then commit. The pre-commit hook (_tools/hooks/pre-commit, turned on with git config core.hooksPath _tools/hooks) runs node _tools/stamp.mjs --check on what's staged and refuses a commit whose fingerprints don't match its files. To give a new link in a page or stylesheet a fingerprint, end it with ?v=; scripts loaded by Boot.js, images in Resources/Sprites/, sounds in Resources/Sounds/, and Resources/Star.webp are listed by themselves. An image linked before it exists gets its fingerprint once it's added and stamped. A small image can live inside a stylesheet instead, as url("data:…") /* inline: /Resources/Background.webp */: stamping rewrites its data from the file it names, so replacing Background.webp and stamping is all it takes. Jekyll doesn't publish _tools/.
  • Update sitemap.xml's lastmod when a public page changes.
  • When a feature changes, update this page and the page's Help.

23. Glossary

In Bank
The money in the budget's bank account at the end of a day, worked out from the last History balance and each day's entries.
Entry
One line on a day: an emoji, an amount, and a title, like ❗️ -$6.50 Coffee.
Refraction type
How an entry affects the budget: Regular (❗️), Hidden (✖️), or Transfer (⭕️).
Recurring entry
An entry that repeats every N days, weeks, or months, written onto the calendar for you; it starts with ✔️.
Unique entry
An entry you added or changed yourself.
Temporary recurring entry (temp)
A unique entry made from a recurring entry on one day (❗️✔️, ✖️✔️, ⭕️✔️). It keeps the recurring entry of its type from being written again that day, and becomes a plain unique entry once that recurring entry can't land there anymore.
Placeholder
An entry that stands in for one you expect, like an estimate, made with the Placeholder switch. It counts like any entry, shows in yellow, and is deleted once its day passes (or a later day picked for it).
% entry
An entry for an Equity account whose amount is a percent of that account's balance as its day starts, worked out again with every change until its day passes.
Goal
An amount for In Bank, the Total, or an Equity account to reach (by a day, if it has one), on Bob's page, with how far along it is and what reaching it takes.
Blocker
A $0.00 temp left when a recurring (or spreadsheet) entry's day is moved or deleted.
Connected calendar
A calendar with work shifts on it (Apple, Google, Outlook, or a work scheduling app), connected on the Spreadsheets & Calendars page with your pay, whose paychecks land on the calendar on their paydays behind a ➕, worked out from the shifts like a paystub.
Pay change
A connected calendar's pay from one paycheck on (like a raise): only what's new, with every older paycheck left as it was.
Connected spreadsheet
A spreadsheet (Google Sheets, Excel, and others) connected on the Spreadsheets & Calendars page, whose entries land on the calendar from today on behind a ➕ (➕❗️, ➕✖️, ➕⭕️) and follow it as it changes.
Upcoming (Future Dates)
Entries dated after the calendar, waiting for their day to join it.
History
Past weeks, kept as they were, newest first.
Transfer
A ⭕️ entry: money changing places (like between In Bank and an Equity account, or depositing cash) without being gained or spent. It changes In Bank, but isn't a cost or gain; one from another Equity account changes the two accounts and leaves In Bank alone.
Max
An Equity account's optional limit, like a credit card's, shown after its balance: "$500.00/$2000.00".
Live updates
Another device's changes showing up on an open page within about 5 seconds, without a reload.
Equity account
An account outside the budget's bank account, like Savings or Cash (every budget has both). Its balance is its starting amount (set by typing in its balance on Equity) plus its entries' changes: the opposite of each Transfer, and each Hidden entry's own amount.
Tracker row and alias
A category in the tracker, and an entry title it counts (all of the amounts, only costs, or only gains).
Transfers (tracker row)
The tracker row that adds up every transfer, so they never land in Undefined. The Interest row under it adds up the Equity accounts' interest.
Undefined
The tracker row that collects titles no other row fully counts (never transfers).
Uncommon recurring payment
A recurring entry that lands every 3 months or less often.
Daily update
The catch-up that runs the first time the budget opens on a new day.
Bob
The character on the home page who says what to keep in mind, with a daily affirmation; his card opens his page of cards (see Bob's Page).
Wavelength (Wavelength Planning)
What a title's money is for (its purpose): one of the budget's 1 to 10 wavelengths, Needs, Wants, and Future to start, named and ordered as you like, which every entry with the title shares. Entry forms ask for it once Bob's Wavelength Planning card is on, and the card's spectrum adds up what each one cost.
Compounding
How often an Equity account's interest starts earning interest of its own: daily, monthly, every 3 months, yearly, or not at all. How often it's added to the balance (every 1, 3, 6, or 12 months) and on which day of the month are set on their own, and Separate Interest keeps what's added as a balance of its own.
Note
Anything to remember about an entry, as long as it needs to be, under the buttons of its form; it goes wherever the entry goes.
Backup
A file Download My Data saved, which Upload A Backup brings back part by part.
Quick Entries To Add
Home's card of entries another device's Quick Entry icon added, for whoever has the budget open to add or delete.
Starting Balance
A new budget's first entry: a ⭕️ Transfer on the day it's set up, holding what was in the bank then.
Revision
A number that goes up with every saved budget table. A save from a page with an older number is refused, so it can't overwrite newer changes.
Passkey
A sign-in key a device makes for Prismal Planning and unlocks with a face, fingerprint, or PIN (Face ID, Touch ID, Windows Hello). The server keeps only its public half.
Quick Entry key
The secret in a home screen icon's link that lets it add entries (and take back ones still waiting) and keep prisms, and nothing else, without logging in.
Prism
A saved entry on the Quick Entry page that fills in New Entry with what it keeps (a title, an amount, a type, or an Equity account), leaving the rest to fill in. Crystals (Paycheck Calculator) and gems (Debt Calculator) do the same for the calculators' boxes.
Session
One signed-in device or browser, good for up to 24 hours. Logout ends it.
Undo step
One change Undo can take back: the days it touched, with each day's own entries from before and after it.
Sprite
The site's own image for ❗️ (a red circle), ✖️ (purple), ⭕️ (green), ✔️ (a blue ring), or ➕ (a yellow plus), and for In Bank, Gains, and Costs (triangles), shown in place of the emoji.
Starfield
The animated stars behind every page. The pointer, taps, and hidden keyboard keys move them, Settings' Reduced Motion can hold it still, and the device's reduced motion setting turns it off (see The starfield background).
Theme
How the site looks on a device (Settings, under Theme): Prismal, Professional, Dark, Spooky, Elements, Poison, Blue, Fall, Winter, Festive, Floral, Digital, Love, Clovers, Playful, Mechanical, or a Custom one of your own (see Themes).
Verified email
An account email whose emailed link was opened, which shows the address is really the account owner's. Connecting spreadsheets needs one.
Other Emails
Other emails of an account's owner, added in Settings (under Email) and confirmed the same way as a verified email. A confirmed one signs in to the account and gets its reset links, and the spreadsheets its Google account shares with [email protected] can be connected.
Date picker
The small calendar the calendar button beside a date box opens, to pick a day instead of typing it.
Date format
How dates are shown and typed on a device: MM/DD/YYYY, DD/MM/YYYY, or YYYY-MM-DD.
Fingerprint
A short hash of a file's contents in its address (?v=…), so browsers keep the file until it changes.
Budget picker
The button above the header's buttons on every signed-in page: it shows the budget that's open, and drops down the account's budgets, the ones shared with it, and its invitations.
Shared budget
A budget its owner shared with other accounts. Everyone who joined it can open it and change anything in it; only its owner can share it, rename it, or delete it.
Invitation
A budget shared with an account that hasn't joined it yet: Join or Decline, in the budget picker's list or Settings.
Change Log
The record of every change to the budget, each one with an Undo while what it changed is still as it left it.

24. Limits At A Glance

WhatLimit
Age18 or older (a birth date up to 120 years ago)
Username5 to 30 characters you can see
Password8 to 256 characters, not one known from data breaches
Entry titleUp to 100 characters (its Equity account after it, and the account a transfer comes from, make up to 233)
Equity account nameUp to 60 characters
Amount (any entry, balance, Max, goal)Up to $1,000,000,000, to the cent
% amountUp to 1000% (not 0), only for Hidden or Transfer with an Equity account, from today on
Interest rateUp to 1000% a year (APR), with as many decimals as it has
Debt CalculatorUp to 50 years of payments; an Equity account's own pace up to 10 years ahead
Recurring frequencyEvery 1 to 999 days, weeks, or months
Calendar4 weeks (28 days), Sunday through Saturday, starting with this week; Lowest in bank after today looks 28 days past it
Equity accounts' look ahead6 months from today
SearchRecurring entries up to 2 years ahead; no To date is a month after today (or From)
TrackerThe last 4 weeks (28 days), 3 months (90 days), and 365 days
Undo25 steps, per browser tab
Change LogsThe newest 1,000; Undo for each change up to about 60 KB, and for the newest rows about 800 KB together
Placeholder's last dayAny day; a recurring entry's, up to 365 days before or after each day it lands on
Goals20
Wavelengths1 to 10, each name up to 30 characters
Titles on a wavelength2,000
NotesAs long as each needs to be, about 1.8 MB of them together; 20,000 characters for one from the Quick Entry icon
Upload A BackupA file of up to 25 MB, and each part of the budget it makes up to about 1.9 MB
Bob's Equity window, line graphs, and goalsUp to 10 years ahead
Budgets10 of your own (your first included), each name up to 30 characters; each shared with up to 10 people (invitations included); up to 20 shared with you (invitations included)
Quick Entry icons10 per account (an 11th stops the oldest)
Waiting quick entries100 per budget
Prisms30 per account
Crystals and gems30 of each per budget, each name up to 40 characters
Push notification devices10 per account
Passkeys20 per account
Other Emails5 per account
Connected spreadsheets10 (with calendars), each up to 8 MB and 5,000 cells per part; entries from 100 days before today to 800 days after, up to 3,000 each
Connected calendars10 (with spreadsheets), each up to 8 MB and 20,000 events; 40 pay changes and 40 title rules; a look ahead of up to 12 months; paychecks kept from 400 days before today (entries from 100)
Signed inUp to 24 hours, and 15 minutes without activity signs out
Emailed linksVerification and Other Email links work for 24 hours; a password reset link once, for an hour
Live updatesAbout every 5 seconds while a page is on the screen
StarfieldUp to 400 stars (fewer on smaller screens)

25. What Each Feature Needs

  • Any budget page: a browser with JavaScript on and site data (cookies and site data) allowed, signed in. The front page, this page, the Privacy Policy, and Not Found work without either.
  • An account: 18 or older, an email address, a password, agreeing to the Privacy Policy & Terms of Use, and passing Cloudflare Turnstile's check.
  • Connecting a spreadsheet, and adding Other Emails: a verified email (the link emailed when the account was made, or Send Verification Email). A spreadsheet shared by link (Viewer), or with [email protected] from the account's email (or a confirmed Other Email). A browser from 2023 or later reads the file. Apple Numbers can't be read (export to Excel).
  • Connecting a calendar: a verified email, the calendar's subscription link (an iCalendar feed: Apple's public calendar link, Google's secret address in iCal format, Outlook's published ICS link, or a work scheduling app's), a first paycheck, and a base pay.
  • Passkeys: a browser and device that can use them (Face ID, Touch ID, Windows Hello, Android, a password manager, or a security key), the site at its web address, and the password to add one.
  • Push notifications: a browser that can show them, notifications allowed, and on an iPhone or iPad, the site added to the Home Screen and opened from there. The calendar link works in any calendar app that subscribes to a link (Google Calendar, Apple Calendar, and most others).
  • A Quick Entry icon: made while signed in (Home's Quick Entry, for the budget that's open), in the phone's own browser (not inside another app). It then works with no sign-in, until the password changes, icons are turned off, or its budget is deleted or isn't shared with the account anymore. Its Lock Screen shortcut needs an iPhone with iOS 18 or newer (Shortcuts); an Apple Watch opens its link from Messages or Mail.
  • A % amount: Hidden or Transfer, an Equity account picked, and a day from today on.
  • A placeholder: a day from today on.
  • A new title: any entry on a day before today; from today on, an entry that doesn't come from a recurring entry or a connected spreadsheet or calendar.
  • Changing a History entry: a day History has; it can move to any day from History's first on, and In Bank follows the last Catchup's rule.
  • Undo: the same browser tab, one of its last 25 steps, and the days it touched unchanged since.
  • Upload A Backup: a file Download My Data saved (this account's or another's), opened on Settings; it goes into the budget that's open.
  • Sharing a budget: a budget of your own, and the other person's Prismal Planning account (their username, or its email or a confirmed Other Email); they join it from their budget list. A budget shared with you can't be shared on.
  • Bob's Payday and Spending Pace cards: 4 months of History, and the card on.
  • Wavelengths on entry forms: Bob's Wavelength Planning card on (it's saved with the budget, so every device and the Quick Entry icon follow, with the same wavelengths).
  • The Debt Calculator's account pace: an Equity account below $0 picked (any balance can be typed in instead).
  • Live updates: the page on the screen and online, with nothing open or unsaved on it (it catches up once there isn't).
  • Sounds: one tap first (browsers allow sound only after one), and Music or Sound effects on in Settings.
  • Another language: the browser's own translation (Chrome, Edge, Safari, or Firefox).

26. Common Questions

Does Prismal Planning connect to my bank account?
No. Prismal Planning never connects to a bank. Entries are typed in (New Entry, or a Quick Entry icon on a phone's home screen), fill in by themselves from recurring entries, or come from a spreadsheet you connect. To match the bank, tap a day's In Bank on the calendar and type what the bank says: the difference goes on that day as a Regular entry titled Catchup.
What does In Bank mean in Prismal Planning?
In Bank is how much will be in your budget's bank account at the end of a day: the In Bank of the day before, plus that day's Regular gains, minus its Regular costs, plus its transfers. Hidden entries (like spending cash) never change it. Every day on the four-week calendar shows its own In Bank, and a day whose In Bank is below $0 turns red.
What's the difference between Regular, Hidden, and Transfer entries?
Regular (a red circle) is an everyday cost or gain: it changes In Bank and counts in the tracker. Hidden (a purple circle) is money spent or received outside your budget's account, like spending cash: it counts as a cost or gain, but In Bank stays the same. Transfer (a green circle with an equals sign) is money moving between your own accounts, like moving $100 into savings: it changes In Bank, but isn't a cost or gain (one from another of your accounts, like Savings into an HSA, doesn't change In Bank at all).
How do I add an entry to a past day or a future day?
Tap the day on Home's calendar (or a day in History) to zoom in on it, then tap its round + button: New Entry opens with that day in its date box. Or use New Entry on Home and type or pick the date. A day after the four-week calendar goes into Upcoming until its day joins the calendar.
Can I change an entry's title?
Yes. Tap the entry on a zoomed day (or in Search's results, an account's list of entries, or Upcoming) and change its Title. Any entry on a day before today can be renamed, History included. From today on, an entry from a recurring entry or a connected spreadsheet or calendar keeps its title; change it on the Recurring Entries or Spreadsheets & Calendars page instead.
Can two people or two devices use the same budget at once?
Yes. Share it: tap the budget's name above the buttons at the top of any page, tap Share beside it, and type the other person's username or email. Once they join it from their own budget list, each of you sees the other's changes within about 5 seconds, with no reload, and each of you can keep budgets of your own too. Your own devices work the same way, signed in on each. Entries from someone else's Quick Entry icon wait on Home, in Quick Entries To Add, for whoever has the budget open to add or delete.
Can I have more than one budget in Prismal Planning?
Yes. Tap the budget's name above the buttons at the top of any page, then New Budget. Each budget has its own calendar, entries, Equity, and Bob, and the same list switches between them, along with the budgets other accounts share with you. An account can have up to 10 budgets of its own.
Can someone I share my budget with share it with others?
No. Only a budget's owner can share it, rename it, or delete it, so the Share button only shows next to your own budgets. Everyone it's shared with can open it and change anything in it, and can leave it, and its owner can stop sharing it with anyone (Share's list, or Settings, under Budgets).
What happens to a shared budget if its owner deletes their account?
It's deleted with the account, for everyone it's shared with, since it's the owner's budget. What the others added to it goes with it, and their own budgets stay just as they are. The owner can save a copy first with Download My Data.
Can I change how Prismal Planning looks?
Yes. In Settings, under Theme, pick Prismal (the neon starfield), Professional (light and plain), Dark (Professional, dark), Spooky (sharp corners, a sharper font, dark with blood red, and embers and bats among the stars), Elements (fire, water, air, and earth, matte), Poison (purple and green), Blue (a medium blue), Fall (pumpkins, orange, and falling leaves), Winter (whites, icy blues, and snow), Festive (red, green, gold, and lights), Floral (pastel flowers), Digital (blocky, black and green), Love (pastel pinks, reds, and hearts), Clovers (dark green, light greys, and clovers), Playful (spring pastels, eggs, and chicks), or Mechanical (steel, brass, and gears). Custom, at the end, makes your own: start from any theme, pick the background, card, word, glow, and chosen colors, and the corners, font, stars, and icons, and watch it change behind its window before you save it. Each device keeps its own theme, even two devices on the same budget, and the login page and the front page look like Prismal (the login page keeps your theme when Quick Entry's Home opens it).
Which accounts does every Prismal Planning budget have?
Savings and Cash. Both are on the Equity page from the start, and can be renamed but not deleted. You can add others, like a credit card (with its interest and its limit, called Max) or an HSA.
How far ahead does Prismal Planning look?
The calendar shows four weeks, starting with this week, and Lowest in bank after today also counts the 28 days after the calendar. Equity shows each balance six months ahead, and the Equity window on Bob's page shows every balance on any day up to 10 years ahead. Search can look up to two years ahead for recurring entries.
What is a placeholder in Prismal Planning?
An entry that stands in for one you expect but don't know yet, like an estimate for groceries. It shows in yellow and counts like any entry until its day passes (or a day picked for it, before or after its own); then the budget deletes it the next time it opens, and In Bank goes on without it.
Does Prismal Planning work offline?
Partly. A change made while offline is kept on the page and saved as soon as the connection comes back (the page tries every 30 seconds, and leaving before then asks first). Signing in and loading the budget need the internet.
Is there a Prismal Planning app?
Prismal Planning runs in any web browser, on a phone or a computer, with nothing to install. A Quick Entry icon on a phone's home screen opens a New Entry form with no sign-in, and opens like an app of its own. The site can also be installed from the browser, which opens Home.
How do I delete my Prismal Planning account?
Settings, Delete Account, with your password. It deletes the account and all of its data at once, the budgets it owns included, for everyone they're shared with. Download My Data (in Settings, under Your Data And Privacy) saves everything first, if you'd like a copy.
Can I bring my Prismal Planning back from a backup?
Yes. Download My Data (in Settings, under Your Data And Privacy) saves a copy of everything, and Upload A Backup (just under it) brings one back: for each part of your budget the file has (History, Home's calendar, Upcoming, Recurring Entries, Equity, Goals, Bob's page, the tracker, connected spreadsheets and calendars, the Paycheck Calculator, notes, and Change Logs), pick Prefer Current Data (yours stays where the two clash, and the rest of the backup is added), Prefer Uploaded Data (the backup's wins where they clash), or Remove Current Data (the backup's takes the place of yours). Parts the file doesn't have stay as they are.
Can Prismal Planning work out my paychecks from my work schedule?
Yes. Connect the calendar your shifts are on (Menu, then Spreadsheets & Calendars, then Add Calendar) and fill in your pay: paydays, base pay, overtime, night pay, pay by event title, breaks, bonuses, deductions, and taxes (a percentage, or worked out from your W-4). Each paycheck lands on its payday, and follows the calendar as shifts change. See Connected calendars.
How do I see how much paying extra on a loan or credit card saves?
Use the Debt Calculator (Menu, then Debt Calculator). Type what's owed, its interest (the APR, how it compounds, and when it's added), and the payment, or pick one of your Equity accounts to fill them in. It shows when it's paid off and the interest on the way, what paying extra each time saves, and the payment it takes to be done by a day, with every payment in a list. With an Equity account picked, it also shows that account's own pace from your budget, and its entries before and after today. It keeps what you typed for next time, and gems save the debts you look at often.
Is Prismal Planning part of Prism Wallet, Prism Data, Prism Money, or another Prism company?
No. Prismal Planning is not in any way affiliated with Prism Wallet, Prism Data, Prism Financial, Prism Money, Prism Bill Pay, or any other entity not named exactly "Prismal Planning".