> For the complete documentation index, see [llms.txt](https://codifi-fdm.gitbook.io/codifi-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://codifi-fdm.gitbook.io/codifi-docs/mobile-app/creating-records/repeaters.md).

# Repeaters and Duplicate-and-Edit

A **repeater** is a section inside a Record that can hold multiple rows of the same fields. Soil horizons are the classic example — each Record (like a Shovel Test Probe) has one or more rows logged in a Horizon repeater, each row describing one stratum.

If you've used Survey123 or ArcGIS Field Maps, repeaters are the same concept as "repeat groups."

***

## What a repeater looks like

```
Horizon  (3 rows)                                                  +
─────────────────────────────────────────────────────────────────────
Row 1                                                              ▼
  Top:     0      Bottom: 20    Texture: Sand
Row 2                                                              ▼
  Top:    20      Bottom: 45    Texture: Loam
Row 3                                                              ▼
  Top:    45      Bottom: 80    Texture: Clay

+ Add a new row
```

Each row has the same sub-fields (Top, Bottom, Texture, etc.) — the sub-fields are defined by your Composition. Rows are independent: you can add as many as the data requires.

***

## Adding rows

Tap **+ Add a new row** below the repeater. The row opens with the sub-fields ready for input. Fill them and move on.

You can also add a row by tapping the **+** icon next to the repeater's section header.

***

## Editing existing rows

Tap a row's collapsed header to expand it for editing. Edit any sub- field; changes auto-save as you move between fields, just like any other field in Codifi.

Collapse a row by tapping its header again. Big stratigraphies are much easier to navigate when only the row you're editing is expanded.

***

## Duplicate and Edit (the time-saver)

If the next row is mostly similar to the previous one, **long-press** the previous row and choose **Duplicate and Edit**.

Codifi copies the row's values into a new row, then opens the new row for editing. You just adjust the fields that differ.

This is gold for:

* **Stratigraphies with similar layers** — copy "Loam" + tweak depth bounds rather than re-entering everything.
* **Artifact tallies** — copy a row with the same material type and change the count and dimensions.
* **Photo log entries** — copy direction and conditions, change the photo number.

***

## Deleting rows

Long-press a row → **Delete**. The row is removed; remaining rows renumber automatically.

> Deleted rows don't go to a trash bin — they're gone. If you delete by mistake, the per-Record [Edit History](/codifi-docs/mobile-app/edit-history-recall-and-project-history.md) shows what was there, but you'll have to re-enter the values.

***

## Reordering rows

Long-press a row → drag to reorder. Useful when:

* You logged horizons in the wrong order and want them top-to-bottom.
* You re-grouped artifacts by material and want the list to reflect the grouping.

Reordering is a real edit captured in history.

***

## How repeaters interact with Ripple

Repeaters work with Ripple formulas the same way as any other field:

* **Per-row calculations.** A "Thickness" sub-field can auto-calculate from `Bottom - Top` within each row, independently for each row.
* **Row-spanning rollups.** A "Total Depth" field on the **parent Record** (not inside the repeater) can sum the thicknesses of all rows, giving you the deepest horizon's bottom value automatically.
* **Conditional row sub-fields.** A "Charcoal Notes" sub-field can be configured to appear only when the row's "Charcoal Present" toggle is on — same conditional visibility rules as anywhere else.

Look for the **FX icon** next to a sub-field's label to confirm it's Ripple-driven.

> If the rollup on the parent Record isn't updating as you add rows, sync the Record and re-open — most rollups update on every edit, but a stale view sometimes needs a refresh.

***

## Common questions

### How many rows can a repeater hold?

There's no hard limit. Practically, repeaters with more than a few dozen rows get unwieldy on a small iPad screen — consider whether the data belongs in child Records of its own archetype instead.

### Can I have a repeater inside a repeater?

Not currently. If you find yourself wanting nested repeaters, the data probably wants to be modeled as a child archetype. Talk to your project manager about restructuring the Composition.

### What happens to repeater rows when I sync?

They sync exactly like any other field data — atomically as part of their parent Record. No special handling.

### Can I copy rows between Records?

Not directly. Duplicate and Edit copies within the same Record. Copying between Records means re-entering — but that's a rare need when each Record's data is per-Record by definition.

***

## Related

* [**Understanding Archetypes and Relationships**](/codifi-docs/mobile-app/creating-records/understanding-archetypes-and-relationships.md) — when to use a repeater vs a child archetype.
* [**Ripple from a Field Crew's Perspective**](/codifi-docs/mobile-app/creating-records/ripple-for-field-crews.md) — what those FX icons mean and what to do if a calculated value looks wrong.
* [**Example 1 — STPs on a Transect**](/codifi-docs/mobile-app/creating-records/example-1-stps-on-a-transect.md) — repeaters in context as part of a full workflow.
