← Electronic Catalog Maker

Privacy Policy

Electronic Catalog Maker — Editor & Viewer

Short version: these apps don't collect, store, or transmit any personal information. Everything runs locally, in your browser or in the installed app, against files on your own device — with one optional exception, real-time collaboration, described below.

What the apps do

The Editor and Viewer read and write .ecatm catalog files — a single portable SQLite file, opened either from your local disk or from a URL you provide. All of the actual work (reading, editing, searching, rendering) happens on your device via sql.js, a SQLite build compiled to WebAssembly. There is no backend server run by this project, no account, and no sign-in — we have nothing to store even if we wanted to.

Local files

When you open or save a catalog, the browser's File System Access API (or a plain file picker as a fallback) asks the operating system to read or write exactly the file you selected. That file never leaves your device unless you yourself choose to share it — nothing is uploaded to us or to any third party by the apps themselves.

Grid Composer

Grid Composer turns a folder of photos and a table (CSV/TSV, or text pasted from a spreadsheet) into a ready-made catalog file. Everything happens in your browser or in the installed app, on your own device: the photos and the table you pick are read and combined locally, and the finished .ecatm file is offered to you as an ordinary download. Nothing is uploaded to us or to any third party, and Grid Composer has no account, no sign-in, and no analytics of any kind.

Map Composer

Map Composer turns a map and the places you mark on it into a catalog file. The points you place, their names, photos and the finished .ecatm file stay on your own device; the file is offered to you as an ordinary download. Nothing you create is uploaded to us. It has no account, no sign-in, and no analytics of any kind.

Showing a map needs the network, so while the map is on screen your browser or the installed app requests map tiles (and the map style and fonts) from OpenFreeMap, as any web map does; those requests reveal the area you are looking at and your IP address to that service. If you search for an address, the text you typed is sent to OpenStreetMap's Nominatim search service, only when you press Enter or the search button. We don't see or store either.

Real-time collaboration (optional)

The Editor has an optional feature, real-time collaboration, that lets more than one person edit the same catalog together and see each other's changes live. This is the one feature that does talk to a server — but never one this project operates. It only activates if you click 🤝 Start collaboration yourself, or open a link someone sent you that joins a session they started.

The server on the other end is a small, separate, open-source app ( @ecm/collab-server) that whoever starts a session runs on their own computer — this project doesn't host or operate one on anyone's behalf. Starting a session sends that catalog's contents to that server, which relays live edits between everyone connected and holds them only in memory, only for as long as that person keeps the app running; nothing is written to that server's disk, and closing the app (or the session ending any other way) discards everything it was holding. Joining a session also means picking a display name — not tied to any account or identity — so other participants can see who's currently there.

To be reachable by a collaborator outside its own computer, that server routes its connection through a third-party tunneling service (Cloudflare's free "quick tunnel," via a temporary trycloudflare.com address) — a real third party in the data path for that session, subject to Cloudflare's own privacy policy, not ours. See that package's own documentation for the full technical detail.

Sharing catalogs from your computer (optional)

There's a separate, optional tool, @ecm/catalog-server, that shares a folder of .ecatm files from your own computer with other devices — on your local network by default, or over the internet if you switch it to Internet mode. It's a separate app you run yourself; the Editor and Viewer don't talk to it unless you point them at an address it's showing.

It remembers the folder you picked and whether you last used local-network or Internet mode in a small file on your own computer (~/.ecm-catalog-server/config.json) so you don't have to reselect them next time — that file never leaves your device. The catalog files themselves are only read, never modified, and are served as-is to whoever has the address it shows; anyone with that address can download them for as long as the app keeps running.

Internet mode uses the same Cloudflare "quick tunnel" mechanism as real-time collaboration above (see that section for the technical detail and Cloudflare's own privacy policy) to give the shared address a public https://*.trycloudflare.com URL instead of a local-network-only one.

Importing your online store (optional)

Another separate, optional tool, @ecm/store-importer, saves the products of your own online store (Shopify, Squarespace, Square Online, Wix or Payhip) as a folder of photos plus a table that Grid Composer can build a catalog from. It's an app you run yourself on your own computer; its page is only reachable from that same computer.

The only requests it makes are to the store whose address you enter (and to the servers its platform keeps that store's product list and photos on) — to read the store's public product list and download the photos. For Payhip, it makes no requests for the product list at all: you save the store's pages in your browser and pick the saved files. Everything it downloads is saved into the folder you choose, on your own computer; nothing is sent to us or to anyone else. It remembers the folder you picked in a small file on your computer (~/.ecm-store-importer/config.json), which never leaves your device. It has no account, no sign-in, and no analytics of any kind.

Opening a catalog from a URL

If you open a catalog via a remote link (for example, one of the demo catalogs, or a link someone shared with you), your browser makes a request directly to whatever server hosts that file. That request is between you and that host — we don't see it, and it's subject to that host's own policies, not ours.

Analytics

The public website (this landing page, and the Editor/Viewer when opened in an ordinary browser tab) uses GoatCounter, a privacy-friendly, cookie-free page-view counter. It doesn't use cookies, doesn't track you across sites, and only records anonymous, aggregate visit counts — never anything tied to an individual person.

Besides page views it counts a few anonymous actions, by name only: that a new catalog was started in the Editor, a picture was added, a hotspot was added, a catalog was saved, or one of the landing page's demo tabs or the 3-step wizard was opened. Only that the action happened is recorded — never the contents of a catalog, a file name, or anything you typed.

The installed desktop app (Editor or Viewer, once added to your Start menu / taskbar via the browser's install prompt or the Microsoft Store) is built to never contact this analytics service at all — it's blocked at two independent levels in the app itself, specifically so that using the installed app stays entirely private and offline-first.

Buying an item from a catalog

Some catalogs include a "Buy" button on individual items, configured by whoever built that catalog. Clicking it takes you to a third-party store (for example Payhip) to complete a purchase there. Any payment or personal information involved is handled entirely by that store, under its own privacy policy — the Editor and Viewer apps never see, collect, or process it.

Third-party services used by this project

None of these are things the Editor or Viewer apps themselves run, operate, or receive data from beyond what's described above.

Changes to this policy

If this ever changes (for example, if a future feature needs to talk to a server), this page will be updated to reflect that honestly.

Contact

Questions about this policy: open an issue on GitHub.