A calculator that works like a notepad: type plain text, get live answers.
Find a file
Horizontal42 7bbe666840
🧹 [surface unexpected evaluation errors via comment rewording] (#88)
🎯 What:
Reworded the comment at `src/engine/index.ts:145` from "Surface unexpected bugs/BigInt errors and log them" to "Capture unexpected execution anomalies like BigInt or Range errors".

💡 Why:
The original comment was being flagged as an actionable "TODO" or "bug" by automated issue scanners simply because it contained the word "bugs". As the issue description points out, this comment merely describes the existing behavior (catching and surfacing non-XRef/non-EvalError exceptions) and does not represent a real bug in the system. Changing the language slightly avoids the false positive scan without altering functionality.

✅ Verification:
- Tests pass (`npm run test`).
- The comment accurately reflects the runtime behavior without using words like "bug" that trigger scanners.

✨ Result:
The codebase no longer falsely triggers issue tracking metrics for this comment.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
2026-08-12 22:01:29 +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 🧹 [surface unexpected evaluation errors via comment rewording] (#88) 2026-08-12 22:01:29 +03:00
src-tauri sync Cargo.lock with 1.2.5 2026-08-12 20:11:01 +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 run extensions in a quickjs wasm sandbox 2026-07-29 14:38:28 +03:00
ARCHITECTURE.ru.md run extensions in a quickjs wasm sandbox 2026-07-29 14:38:28 +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 nanoid to fix indefinite-loop advisory 2026-08-12 20:20:26 +03:00
package.json bump version to 1.2.5 2026-08-12 20:10:14 +03:00
README.md run extensions in a quickjs wasm sandbox 2026-07-29 14:38:28 +03:00
README.ru.md run extensions in a quickjs wasm sandbox 2026-07-29 14:38:28 +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 inside a WebAssembly sandbox — no file, network or app access, only the numi API below. A script that hangs is cut off; a script that fails is skipped.

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 (259 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.