Firetool

Home / Features / Firestore data editor

Data editor

A Firestore data editor that keeps every type exact

Edit Firestore documents one field at a time in a table, or whole as JSON. Firetool sends only what you changed, keeps each value's type as stored, and asks before it saves over someone else's newer change.

Why it matters

Plain JSON can't hold everything Firestore stores

Firestore has 64-bit integers, doubles, timestamps with microseconds, references, geopoints and bytes. Plain JSON has one kind of number and no dates. A careless round trip can turn 10.0 into 10, cut the last digits off a large ID, or drop a timestamp's microseconds. In Firetool, a save changes only the fields you touched and leaves the rest as stored.

Edit in the table

Double-click a cell to change one field

Open a collection and its documents appear as rows, one column per field. Double-click a cell, type the new value and press Enter. Escape puts the old value back. Only that field is written, using an update mask, so the rest of the document isn't touched.

  • Type 42 for a number, true for a boolean, plain words for text, or JSON for a map or array
  • A value you didn't change isn't written at all
  • A field stored as a double stays a double when you change its number
  • Click a document ID to open the whole document in the editor beside the table
A customers collection in Firetool's table, with one document open as JSON in the editor on the right

Edit as JSON

The whole document, with nothing rounded

The editor shows the document as JSON, with its created and updated times. Values plain JSON can't show are written as small tagged objects that you can read, change and type yourself.

  • Large integers keep every digit
  • Timestamps keep their microseconds
  • Inside maps and arrays, the parts you didn't change keep their stored form
  • The editor says straight away whether the JSON is valid; Format tidies it
{
  "name": "Asha Rao",
  "accountNo": { "$int": "9007199254740993" },
  "rate": { "$double": 10 },
  "joinedAt": { "$timestamp": "2026-04-01T09:30:00.123456Z" },
  "manager": { "$ref": "users/alice" },
  "branch": { "$geo": { "lat": 12.97, "lng": 77.59 } },
  "photo": { "$bytes": "iVBORw0KGgo=" },
  "tags": ["priority", "kyc-done"],
  "address": { "city": "Pune", "pin": "411001" }
}

Types

How each Firestore type looks in the editor

Ordinary text, booleans, null, small integers and decimals are plain JSON. The rest use one of these forms.

Firestore typeIn the editor
Integer larger than JavaScript can hold (beyond 253){"$int": "9007199254740993"}, any 64-bit whole number
Double that is a whole number{"$double": 10} is 10.0; a plain 10 is an integer
NaN and infinity{"$double": "NaN"}, {"$double": "Infinity"}, {"$double": "-Infinity"}
Timestamp{"$timestamp": "2026-04-01T09:30:00.123456Z"}; a full time is sent as written, microseconds included
Reference{"$ref": "users/alice"}, a document path in the same database
Geopoint{"$geo": {"lat": 12.97, "lng": 77.59}}
Bytes{"$bytes": "…"}, as base64
Arrays and mapsPlain JSON arrays and objects

Saving

Only the changed fields are sent

When you press Save, or Ctrl+S (⌘S on a Mac), Firetool compares the JSON with the version it loaded. The fields you changed, added or removed go in the update mask. Every other field is left alone, even if someone else changed it in the meantime.

  • If nothing changed, nothing is written: the editor says "No changes to save"
  • Remove a field from the JSON and it's removed from the document
  • Every save goes in Firetool's audit log, and a single-document edit keeps a copy you can restore unless your policy turns copies off

Conflicts and drafts

Nobody's save is lost by accident

Each save carries the document's last update time as a condition. If someone saved it after you opened it, Firestore refuses the write and Firetool asks you: save your changed fields over their version, or keep editing. The fields you didn't touch keep their new values either way. If the document was deleted meanwhile, you can create it again with everything in the editor.

  • Move to another document or tab with unsaved edits and they're kept as a draft while Firetool is open; open the document again to restore or discard them
  • A restored draft still checks for newer saves
  • With Live refresh on, an open document shows the latest version, or tells you someone saved it if you have edits

Documents and collections

Everything around the edit

New document

New document opens an empty editor. Type an ID, or leave it empty for an automatic one.

Duplicate

Duplicate, in the editor or a row's menu, opens a copy as a new document with the same exact types.

Delete

Delete one document, or select rows and delete them together in batches of 500. Subcollections aren't deleted, and you're asked first.

Subcollections

The editor lists a document's subcollections. Click one to open it in its own tab.

Getting around

Browse collections in the sidebar, type a path with suggestions, or use Open path… for a deep collection or one document.

Right-click menus

A row's menu opens, copies the ID, path or JSON, copies a cell's value, filters by it, duplicates or deletes. A column's ⋮ menu sorts, filters, hides it or changes the field across documents.

How it works

Change a document in three steps

Open a collection

Pick it in the sidebar or type its path. Filter the rows if you need to find one document.

Edit a cell or the JSON

Double-click a cell for one field, or click the document ID and edit the JSON.

Save

Only the changed fields are sent, and only if nobody saved the document since you opened it, unless you choose to.

Browsing and reading are free. Editing, creating and deleting documents need Firetool Pro, and a project marked read-only in Project settings can't be changed at all.

Questions

Editing Firestore data: common questions

Why does a large number in my document show as {"$int": "…"}?

JavaScript numbers lose precision beyond 253, about 9 quadrillion. Firestore integers go up to 64 bits, so Firetool shows larger ones as text inside $int to keep every digit. Edit the digits inside the quotes and save; the value is stored as a 64-bit integer again.

How do I store 10.0 as a double instead of the integer 10?

Write {"$double": 10}. A plain 10 is saved as an integer. If the field was already a double, changing its number keeps it a double without the tag.

What happens if a colleague saves the same document while I'm editing it?

Your save is refused by Firestore because the document's update time changed, and Firetool shows when it was saved. You can save your changed fields over their version, keeping their other changes, or keep editing and reload the latest version.

Can I edit documents in the Tree and JSON result views?

No. The Tree and JSON views of the results are for reading. Edit a field in the Table view, or open the document and edit it in the editor.

Try it on your own data

Free for Windows, macOS and Linux, with every Pro feature for the first 30 days.