A calculator that works like a notepad: type plain text, get live answers.
Find a file
Horizontal42 c1a7254fdf fix arbitrary file write via write_text_file/write_image_file
Both Tauri commands took a raw path string straight from the frontend
and wrote to it with no validation — any code able to call invoke()
(a compromised or malicious extension script, which run with full page
privileges) could write to any path the OS user has access to, not just
one chosen through the save dialog. Move the save-file dialog into the
Rust command itself so the only path ever used is one the native dialog
returned; the frontend now only sends the content to save.
2026-07-08 15:50:13 +03:00
.github/workflows release: publish the release instead of leaving it a draft 2026-07-03 13:47:14 +03:00
scripts feat: Summarum — natural language calculator notebook for Windows 2026-06-10 22:19:24 +03:00
src fix arbitrary file write via write_text_file/write_image_file 2026-07-08 15:50:13 +03:00
src-tauri fix arbitrary file write via write_text_file/write_image_file 2026-07-08 15:50:13 +03:00
.gitattributes add .gitattributes to normalize line endings to LF 2026-06-18 22:00:44 +03:00
.gitignore gitignore AI-agent scratch files and the local cargo config dir 2026-07-08 14:19:12 +03:00
ARCHITECTURE.md docs: tabbed settings, auto-update toggle and diagnostics 2026-07-03 12:03:58 +03:00
ARCHITECTURE.ru.md docs: tabbed settings, auto-update toggle and diagnostics 2026-07-03 12:03:58 +03:00
index.html add aria-labels to icon-only buttons and inputs 2026-07-08 14:03:32 +03:00
LICENSE switch license to PolyForm Noncommercial 1.0.0 2026-07-01 13:21:01 +03:00
package-lock.json bump version to 1.2.0 2026-07-03 13:26:32 +03:00
package.json bump version to 1.2.0 2026-07-03 13:26:32 +03:00
README.md docs: tabbed settings, auto-update toggle and diagnostics 2026-07-03 12:03:58 +03:00
README.ru.md docs: tabbed settings, auto-update toggle and diagnostics 2026-07-03 12:03:58 +03:00
tsconfig.json feat: Summarum — natural language calculator notebook for Windows 2026-06-10 22:19:24 +03:00
vite.config.ts fix vite dev server: bind 127.0.0.1, ignore src-tauri/target 2026-07-01 17:35:26 +03:00

Summarum

Русский

A calculator that works like a notepad. Type what you're thinking — every line gets a live answer in the right column. No buttons, no formula syntax, just text.

# Trip to Lisbon
flights $420
hotel $95 * 4 nights
food 30€ a day * 4 days and museums 25€
total                          → $1,066.97

5 inches in cm                 → 12.7 cm
100 km/h in mph                → 62.14 mph
$2000 in rubles                → 144,060 ₽
20% off 1500                   → 1,200
today + 6 weeks                → 22 July 2026
1000 USD in EUR on 2024-01-01  → € 917.30
? * 1.2 = 1000                 → 833.33
AAPL in USD                    → $213.55
days until 2027-01-01          → 183 day
chart                          → ▂▄▇█▆

Works in English and Russian at the same time: 5 метров в см, 20$ в евро, сумма — no language switching.

Install

Grab the latest Summarum_*_x64-setup.exe (or arm64-setup.exe on Windows on ARM) from Releases, run it, done. The whole app is about 2 MB. It checks for updates on its own after that.

Requirements:

  • Windows 10 (1803+) or Windows 11, 64-bit.
  • WebView2 Runtime — already part of Windows 11 and most updated Windows 10 systems; if it's missing, the installer downloads it automatically.
  • Internet connection is only needed for live rates and market data — everything else works offline (rates fall back to a cached/bundled snapshot).

What it understands

Plain math — 2 + 2, 8 / (45 - 20%), parentheses, ^, sqrt, sin, factorials, random(), random(1; 6). Decimal-exact: 0.1 + 0.2 is 0.3, not 0.30000000000000004.

Words as operators — 12 plus 4, 20 divided by 4, 5 и 3. Text around the math is ignored, so spent 20 on pizza and 5 on coffee just gives 25.

Units — length, weight, volume, area, temperature, time, angles, data (1 GiB in MB), CSS px/em, speed, pressure, energy, power, frequency, fuel:

6 feet in meters        1 atm in mmHg         8 л/100км in mpg
2 hours 30 min in min   150 hp in kW          32 px in em

Money — ~150 currencies and the top-20 crypto with live rates (refreshed hourly, cached for offline). $100 + 20%, 5 eth in USD, 9800 рублей в долларах.

Live market data — stock and commodity prices refreshed every 15 minutes: 100 AAPL in USD, 2 GC=F in USD (gold futures), MSFT + GOOGL.

Historical exchange rates — 1000 USD in EUR on 2024-01-01 looks up the ECB rate for that exact date (via frankfurter.dev) and caches it permanently.

Percents the human way — 20% of 80, 20% off 1500, 5 as a % of 25, 20% of what is 30.

Dates and time — today + 2 weeks, tomorrow - today, time in New York (also works with a raw IANA id: time in Europe/Berlin), now in unix, 1750000000 as date. Date literals: ISO (2024-01-01 + 30 days), or dot/slash with a 4-digit year — 31.12.2024, 12/31/2024 — where the day/month order for ambiguous cases follows the Date format setting. days until 2027-01-01, days since 2020-03-15.

Goal seek — put ? where the unknown is and an = with the target: ? * 1.2 = 1000 → 833.33, 100 - ? = 30 → 70. Works for any expression solvable by linear probe or bisection.

Programmer stuff — 0xFF & 0x0F, 1 << 4, 255 in hex, in binary, plus in fraction (0.75 → 3/4) and in roman (2026 → MMXXVI).

Sheets that calculate — variables (rent = $500), running totals (sum, avg, prev, count, min, max, product), # headers, // comments. The status bar always shows the sheet total; select a few lines to see just their sum. Add chart at the end of a block to draw a sparkline.

Cross-sheet references — pull a value from another sheet with @: @Budget.total, @Budget.rent, @[Trip to Lisbon].food. A sheet made of nothing but references becomes a live dashboard: @Assets.total - @Debts.total. Give the source sheet a fixed name (not an auto-derived one) so the reference doesn't break when its first line changes.

Handy things

  • Ctrl+Alt+N (configurable — the settings field records keys you press) shows/hides the window from anywhere. Closing hides to tray.
  • Ctrl+W closes the current sheet (asks first if it has content).
  • Ctrl+F (or the 🔍 button) searches every sheet at once — by text or by result value: >1000, <50, =100, ~100 (±1%). Click a hit to jump there.
  • Click a result to copy it. Copying a line copies it with the answer (rent * 3 = $1,500). Ctrl+Shift+C copies the whole sheet with answers.
  • Export as image — the ⤓ menu includes "Copy as image": renders the sheet to a PNG and puts it on the clipboard (falls back to file save if the browser blocks clipboard write).
  • Drag the divider to resize the results column.
  • Drop a .numi, .sum, .txt or .md file into the window to open it as a sheet.
  • Pin and reorder sheets — click the pin icon on any sheet in the sidebar to keep it at the top; use ↑↓ to rearrange.
  • Backups are automatic: a daily snapshot of all sheets (last 14 kept), and deleted sheets sit in a bin for 14 days (configurable) — restore one by dragging the file back in. Settings → Backups opens the folder.
  • Data folder is configurable — point it at OneDrive/Dropbox and your sheets follow you between machines.
  • Always on top (Settings) pins the window above everything else.
  • The app checks for updates on launch and every few hours after that, and offers to install them — no manual download-and-reinstall. Settings → Updates → "Check for updates" runs one on demand, or turn automatic checking off entirely with the toggle next to it.
  • Light/dark theme, en/ru interface, configurable precision, separators, and date format (system locale, 31.12.2024, 12/31/2024, or 2024-12-31). Settings is split into General / Format / Data / Updates tabs.

Extensions

Note: extensions run as trusted local scripts with access to your files. Only load code you wrote or fully trust.

Drop a .js file into the extensions folder (Settings → Extensions folder) and restart. The API is compatible with Numi extensions:

numi.setVariable("vat", { double: 20 });
numi.addUnit({ id: "floor", phrases: "floor,floors", baseUnitId: "meter",
               format: "fl", ratio: 3 });
numi.addFunction({ id: "hyp", phrases: "hyp" },
  (v) => ({ double: Math.hypot(v[0].double, v[1].double) }));

Then 5 floors in meters → 15 m and hyp(3; 4) → 5.

Bugs and ideas

Open an issue. A line of text and what you expected is enough.

For developers

Engine internals, project layout and how to add units/currencies: see ARCHITECTURE.md.

npm install
npm test               # engine tests (152 cases)
npm run tauri dev      # run the app
npm run tauri build    # build the installer

To build from source you need:

Stack: Tauri 2 + TypeScript + CodeMirror 6.

Credits

Inspired by the excellent Numi by Dmitry Nikolaev — if you're on macOS, buy it. Summarum is an independent project, built from scratch for Windows.

License

PolyForm Noncommercial 1.0.0 — free for personal, educational, and other noncommercial use. Commercial use (including resale or repackaging) is not permitted.