Firetool

Home / Docs / Edit documents

Docs

Edit Firestore documents and JSON

Change a field right in the table, or edit a whole document as JSON, keeping exact types for numbers, timestamps and references. Opening and reading documents is free; saving, adding and deleting need Firetool Pro (or the trial).

Edit a cell in the table

  1. Open a collection and run a query (see Query Firestore). Make sure the Table view is on.
  2. Double-click a cell. It turns into a text box with the current value.
  3. Type the new value and press Enter to save. Esc, or clicking somewhere else, cancels.

The table's columns are the documents' top-level fields, so a cell edit changes one top-level field. A map or array cell turns into its JSON when you edit it; for more room, open the document instead.

What you type is read as JSON where it can be: 42 is a number, true a boolean, null null, [1, 2] an array. Anything that isn't valid JSON, such as Active without quotes, is saved as text. The field keeps its stored type where that still fits: edit a double and it stays a double. Only that field is sent, and an unchanged value isn't written at all.

Open a document

Click a document's ID in the first column (or right-click the row and choose Open). The document editor opens on the right, showing:

  • the document ID and its full path;
  • when it was created and last updated;
  • the fields as JSON, with a line under it that says Valid JSON or what's wrong;
  • its subcollections as chips: click one to open it in its own tab;
  • Save, Duplicate, Format and Delete.

In the Tree view, double-click a document's name to open it. You can also type a document path, such as users/alice, in the path box and run it. Drag the editor's left edge to make it wider.

Edit as JSON and save

  1. Edit the JSON. Tab inserts two spaces, and Format tidies the indentation.
  2. Add a field by adding a key, change a value, or delete a key to remove that field.
  3. Choose Save, or press Ctrl+S (⌘S on a Mac).

Firetool compares your JSON with the version it loaded and sends only the top-level fields you added, changed or removed. Fields you didn't touch are left exactly as stored, including types the JSON can't show (a double like 10.0, a 64-bit integer, a timestamp's microseconds). If nothing changed, it says "No changes to save".

Exact types: the value notation

Plain JSON has no timestamps, references or 64-bit integers, so the editor uses small objects for them. Each one is an object with exactly one key:

WriteSaved in Firestore as
42an integer (a whole number)
4.5a double
{"$double": 10}the double 10.0 (plain 10 would be an integer)
{"$double": "NaN"}, "Infinity", "-Infinity"NaN or infinity, which plain JSON can't hold
{"$int": "9007199254740993"}a 64-bit integer too big for a JavaScript number, as its exact digits
{"$timestamp": "2026-03-14T09:30:00.123456Z"}a timestamp; a full time with Z or an offset is sent as written, keeping microseconds
{"$ref": "users/ravi"}a reference to a document in the same database
{"$geo": {"lat": 12.9716, "lng": 77.5946}}a geopoint
{"$bytes": "SGVsbG8="}bytes, as base64

A whole document with every kind of value:

{
  "name": "Asha Rao",
  "visits": 12,
  "rating": { "$double": 4 },
  "followers": { "$int": "9007199254740993" },
  "score": { "$double": "NaN" },
  "joinedAt": { "$timestamp": "2026-03-14T09:30:00.123456Z" },
  "manager": { "$ref": "users/ravi" },
  "office": { "$geo": { "lat": 12.9716, "lng": 77.5946 } },
  "avatarHash": { "$bytes": "SGVsbG8=" },
  "tags": ["admin", "beta"],
  "address": { "city": "Bengaluru", "pin": "560001" },
  "deletedAt": null
}

The editor shows existing values the same way, so what you see is what is stored. Ordinary integers and doubles appear as plain numbers. A map that has a key like $ref plus other keys is just a map.

When someone saved first

Every save checks that the document hasn't changed since you loaded it. If someone else saved it in the meantime:

  • In the editor, Firetool asks "This document changed since you opened it" and says when. Save my changes anyway writes only the fields you changed over their version; the fields you didn't touch keep their new values. Keep editing stops, and Reload latest (discards your edits) loads their version.
  • If someone deleted it, saving creates it again with everything in the editor, after you confirm.
  • In a table cell, Firetool asks "This document changed since it was loaded"; Save anyway writes that one field.

With Live refresh on, an open document you haven't edited shows the new version by itself. If you have edited it, the editor says someone saved it and offers Reload latest.

Unsaved edits are kept

If you close the editor, open another document or switch tabs with unsaved changes, Firetool keeps them and says "Your unsaved edits … are kept". When you open that document again, the editor shows "You have unsaved edits from earlier." with Restore them and Discard. Restored edits still go through the conflict check when you save. Drafts last until you close Firetool.

New, duplicate and delete

New document

  1. Choose New document above the results (or right-click a collection and choose Add document…).
  2. Type an ID, or leave the ID box empty for an automatic ID. IDs can't contain a slash.
  3. Write the fields as JSON and choose Save.

A tab that shows a collection group can't add documents: open the collection by its full path first.

Duplicate

Choose Duplicate in the editor, or Duplicate… from a row's menu. A new document opens with the same fields and exact types, ready for a new ID. Nothing is saved until you choose Save.

Delete

Choose Delete in the editor or a row's menu, or tick several rows and choose Delete above the results. Firetool asks first. Subcollections are not deleted. Unless your policy turns copies off, the audit log keeps a copy so it can be restored.

Right-click a row, or click the ⋮ beside its checkbox:

  • Open, Copy document ID, Copy document path, Copy as JSON;
  • on a cell: Copy value, and filters for == this and != this value;
  • Duplicate… and Delete.

A column header's ⋮ has Filter by this field…, Hide column, Copy field name, and the bulk changes Set a value in documents…, Rename field in documents… and Delete field from documents…, which change many documents after a preview (see Bulk field changes).

Pro, roles and production

  • Free edition: you can open and read every document. Save, New document, Duplicate and Delete are turned off, and double-clicking a cell offers to enter a licence key.
  • Viewer role, or a project or database marked read-only: Save, Duplicate, Delete and New document are turned off.
  • Production: saving one document doesn't ask. Deleting, and changes to many documents at once, ask you to type the project ID.
  • Every change goes in the audit log, and a policy can ask for a reason for every change.

Questions

Will saving change fields I didn't edit?

No. Only the top-level fields you added, changed or removed are sent. The rest stay exactly as stored, including doubles like 10.0, big integers and timestamps with microseconds.

How do I make a number stay a double, like 10.0?

Write {"$double": 10}. Plain 10 in a new field is saved as an integer. A field that is already a double stays a double when you edit its value.

Can I edit a field inside a map from the table?

A cell holds a top-level field, so a map is edited as a whole JSON value there. For one nested field, open the document and edit it in the JSON; only that top-level field is sent, with the parts you didn't touch kept as stored.