Numlex Documentation
Reference
Report issue

Privacy & network

Local-first by design: what stays on your Mac, every network request the app can make, and how offline fallbacks work.

Numlex is local-first. Your sheets, variables, constants and settings live on your Mac, and the app’s network surface is a small, explicit allowlist: rates, weather, and place lookups. Each one is triggered by a strict line template — if a line does not match, nothing is sent anywhere.

What stays local

  • All calculations, dates and times, variables, sections, totals, unit conversions and degree conversions run entirely on your machine and work fully offline.
  • The temporal and finance catalogs are bundled with the app: timezones, public holidays (2019–2035), sales-tax presets, the 2026 income-tax tables and BLS CPI-U inflation data all resolve offline. Nothing is fetched to answer them.
  • PDF export and printing run fully offline: no network request, no clipboard access and no analytics.
  • Sheets and settings persist in ~/Library/Application Support/Numlex (a single local store).
  • There is no account, no sign-in and no cloud sync of any kind.
  • Numlex never reads GPS or location data — coordinates can only come from the explicit degree syntax you type.

The network allowlist

RequestTriggered byWhat is sent
Rate refreshConversion lines with fiat currenciesNothing identifying — a public rate-table fetch
Weather lookupAny of the five strict weather templates belowOnly the place name you typed
Place lookup (geocoding)location of, latitude/longitude of, and named distance between endpointsOnly the place name you typed
Update checkCheck for Updates…, the automatic check, or accepting an updateNothing identifying — a plain GET of the appcast; an accepted update downloads the announced .dmg from GitHub

All of these are part of the current 4.9.6 release, and everything else on this page follows the same local-first model.

Updates

A Numlex build with the updater reads its appcast at https://numlex.tech/appcast.xml when it checks for updates, and downloads the announced .dmg from the GitHub release URL only when an update is accepted. Both are plain HTTPS requests with no query strings and no identifiers; anonymous system profiling is disabled, and there is no analytics or usage reporting. If the feed is unreachable the app reports the failure and keeps working.

Rates

  • Provider: the free open.er-api.com endpoint, no key, base USD.
  • The table refreshes hourly; the last good rates stay available offline.
  • When a request fails, the app keeps using the last good rates and never invents one.

See the Currency reference for the full catalog.

Weather

The case-insensitive, whitespace-flexible forms are:

weather in <place>
<place> temperature
high in <place>
low in <place>
feels like in <place>

The first two return the current temperature, high and low return today’s high and low, and feels like returns the current apparent temperature. All results use Celsius.

  • Provider: Open-Meteo, no key and no location permission.
  • Only the place name you explicitly typed is sent — never your position.
  • The last successful response is shared across the place’s four weather measurements, cached for 600 seconds and then refreshed in the background. Offline, the last cached reading is used; with no cache at all the line reports Weather unavailable.

See Live data & geography for the exact template rules.

Geocoding & distance

  • Provider: Open-Meteo, using only the geocoding endpoint (no forecast, no key). The top-ranked result resolves the name.
  • Resolutions are cached, so repeated place lookups work offline; if a place cannot be resolved, the line reports Location unavailable.
  • A named distance between endpoint needs geocoding; explicit coordinates are computed entirely offline.
  • The result is a Haversine surface distance, not a route.

What is never sent

No analytics, no telemetry, no crash reporting, no ad or tracking calls. No sheet content, no variables, no calculations and no position data ever leave your Mac. There is no backend to send them to.

Found an issue in these docs? Report it on GitHub