Geospatial field data collection for crews with no signal. I designed it, wrote most of its frontend and moved a national firm onto it.
- My part
- Founding designer, then Head of Product. I designed it and wrote most of the frontend.
- When
- 2023 to 2026
- With
- A team of three. Hugo Bounoua, our solutions architect, built the sync and formula engines and much of the backend. Jonathan Sims, our project manager, ran QA and regression testing.
- Built in
- TypeScript, React, React Native and Mapbox
- Its site
- www.codifi.com, which I rebuilt as well.

What a year of it came to
- 11% to 44%of the firm’s project revenue ran through Codifi, 2025 jobs to 2026 jobs
- 13 to 108people recording in Codifi each month
- 777 to 11,190records captured in a month
- 6%lower bids on projects run in Codifi
- Up to 8%better margins where a team’s data model was mature
- Days to hoursof data entry after fieldwork, in Memphis
At Chronicle Heritage. The user and record counts are August 2025 to August 2026. Memphis is that office’s own result. How the rollout went
Part 1 of 3
What I made
One app in place of the six a survey used to need. The problem first, then the features I designed for a day in the field.
One survey should not need six apps.
Fieldwork ran on a stack nobody chose. A form builder for the forms, a map app for the points, web GIS for the layers, a spreadsheet for checking, a database somebody built years ago and a word processor for the report. Every seam between them was a manual handoff and a place the data could go wrong.
I designed Codifi to replace the seams. You set a project up once, collect on an iPad with no signal, check the data on the web before you leave the site. The report is written from the same records.
The small things that save a field day
Four of the eleven features I designed, each in a render of the real app. I wrote most of the frontend they run on. The other seven are named under them. Any of the eleven opens for a closer look.

LiveTrack
Walk the boundary or the transect. The line draws itself as you go, with GPS accuracy on every point.

Bring your GNSS receiver
Pair a Bluetooth receiver. Satellites and fix quality ride along with every point you capture.

Offline map areas
Download the project area’s basemaps and imagery before you lose signal.

Record history
Who changed what and when, on every record. Review it before anything ships.
Seven more
Part 2 of 3
How I designed and built it
Each section starts from what the field needed and says what was mine. Where an engine is Hugo’s the section says so.
I made offline sync something a crew never has to manage
A crew can spend the whole day out of signal. So the rule I held to was that sync should never be something they have to manage. Every change is saved on the device the moment it is made and travels when there is signal. Nobody presses save and nobody stands in a field watching a bar fill.
Hydra, the offline-first engine underneath, is Hugo’s. My part was making it make sense to the people in the field: the cloud sync status, its icons and the motion that shows what is happening and when. When two people change the same field while they are apart the most recent edit wins. The older value stays in the history, where anyone can see it and bring it back.
Version 3.3 went a step further with Nearby Sync. Two tablets in the same field trade their records directly, with no internet involved. Later, whichever one finds signal carries the crew’s records up with it. Its icon is the next section.

Try it: two tablets, no signal
Step 1 of 4Turn the signal off on both tablets.
Maya’s iPad
Turn the signal off
STP-014
Everything here is synced.
Sam’s iPad
Turn the signal off
STP-014
Everything here is synced.
Both tablets have signal, and everything is synced.
What the office sees on the web
- Result
- Negative
- Depth
- 40 cm
| When | Who changed what | Recall |
|---|---|---|
| 9:12 | Maya on iPad. Depth: new to 40 cm | |
| 9:12 | Maya on iPad. Result: new to Negative |
Two iPads with no signal and the office’s view under them. A guide takes you through it in four steps, from losing signal to seeing which edit the office keeps.
It was built for a bigger screen. On a phone it stacks into a long scroll.
Motion with a reason
Nearby Sync needed an icon for something nobody can see: two tablets trading records with no internet between them. I drew it out of Codifi’s own mark. Unwind the ring and it lays out as a stream between two points.
It moves only when something happens. Turn Nearby Sync on and the stream grows out of nothing. When someone connects, a pulse runs out and back, because sync goes both ways. Then it stops. At rest it is a still drawing. An icon that sits in the nav bar all day costs the battery nothing.
I worked the motion out as a prototype with an AI agent, then built it into the app.
Try it: the Nearby Sync icon
Nearby Sync is on and nothing is happening, so nothing is moving. The icon is a still drawing.
I owned one design system across web, mobile and marketing
A crew lead on an iPad and a GIS analyst at a desk work from the same records. They should plainly be looking at the same product. So I owned one design system for all of it. We refined it with an outside agency. Then I led a full redesign across the web app, the mobile app and the marketing site.
I designed in code. A prototype in the real product went to a field crew and what came back went into the next build. I also designed how the product is presented. These are its App Store screens.




I built the map tools crews trust in the field
A record in the field is a place before it is anything else. So the map had to be good enough to trust and quick enough to use with gloves on. Most of what I built with my own hands is here.
LiveTrack, snapping, the camera compass and external GPS are among the features above. I added Emlid and Bad Elf receivers to the app’s GPS bridge myself. Two more tools did the daily work:
- Draw Mode
- Capture and edit points, lines and polygons on the device, with vertex editing and undo.
- Offset Capture
- Record a point you cannot stand on, from a bearing and a distance.

Native where it counts
React Native let us write the mobile app once. Fieldwork asked for things it does not do on its own. So I treat React Native as a way to reach the platform, not a way round it.
Where it stopped I wrote the native part. A diagnostics module in Objective-C reports memory, CPU and thermal state. I wrote several Expo config plugins. I added Emlid and Bad Elf receivers to the app’s GPS accessory bridge. The bridge itself is mostly a colleague’s work. Those two protocols are mine.
In the current release the interface uses SwiftUI components through Expo UI, native sheets and the system’s Liquid Glass material. It behaves like the iPad it runs on. From version 2.0 on I also ran the iOS releases: I built the app, uploaded it to App Store Connect and took it through two Expo SDK upgrades.
I designed forms that do the math
A field form is full of math. Repeating rows get added up, values come down from a parent record, some questions only apply sometimes and the map brings area, length and distance to a line. The person filling it in is at the hole with no signal.
Ripple, Hugo’s formula engine, runs a rule written once in the project’s template everywhere the form does: on an iPad with no signal, in the browser and on the server.
What I cared about was how that feels to fill in. A calculated field is marked so you know a formula is behind it. If you type over it your value stands, because the person at the hole knows something the formula does not. And a question that does not apply is simply not there.

Try it: a shovel test that fills itself in
A shovel test on transect T-2
STP-014
Stratigraphy
| Top (cm) FX | Bottom (cm) | Texture | Thickness FX |
|---|---|---|---|
Step 1 of 5
Change where the first horizon ends. Try 30.
Result
Location
Drag the point, or use the sliders.
The six rules behind this form
ValueTop
The first horizon starts at the surface. Each one after starts where the one above it ended, and nobody types it.
{"if": [ {"==": [ {"rowIndex": [ {"var": ""} ]}, 0]}, 0, {"repeaterFieldAtRow": ["Horizon", "Bottom", {"-": [ {"rowIndex": [ {"var": ""} ]}, 1]} ]} ]}Right now: 0 cm, 20 cm
ValueThickness
Each horizon’s thickness is its bottom minus its top.
{"-": [ {"getFieldByLabel": [ {"var": ""}, "Bottom"]}, {"getFieldByLabel": [ {"var": ""}, "Top"]} ]}Right now: 20 cm, 25 cm
ValueTotal Depth
Total depth is the deepest horizon’s bottom. If you type a depth yourself, yours wins.
{"maxRepeater": ["Horizon", "Bottom"]}Right now: 45 cm
VisibilityArtifact Count
Only ask how many artifacts when the result is Positive.
{"==": [ {"getFieldByLabel": [ {"var": ""}, "Result"]}, "Positive"]}Right now: hidden
ValueDistance from Transect
Measure from this point to its parent transect’s line, to a tenth of a metre.
{"round": [ {"pointToLineDistance": [ {"var": ""}, {"parent": [ {"var": ""} ]} ]}, 1]}Right now: 3.3 m
VisibilityOff the line
Warn when the point is more than 10 m off the transect.
{">": [ {"getFieldByLabel": [ {"var": ""}, "Distance from Transect"]}, 10]}Right now: hidden
A shovel test form beside a small map and the rules that drive it. A short tour walks you through five changes and marks each rule as it fires.
It was built for a bigger screen. On a phone it stacks into a long scroll.
Reports: the deliverable writes itself
The report is the reason the fieldwork happens. In Codifi it is a Word or Excel file with tags in it. You bring the template your agency already accepts and the server fills it from the records: fields, tables of child records, photos with their captions and bearings.
Nothing is retyped so nothing is mistyped. The Memphis office cut its post-field data entry from days to hours.
Try it: one template, the same records
Anything in double curly brackets is filled in from the records. Edit it. A tag the engine cannot read prints __INVALID TAG__, the way a real report does.
The report
Transect T-2: shovel test results
Recorded by Maya R. on October 14, 2026
3 shovel tests were dug on this transect.
| STP-012 | Negative | 60 cm |
|---|---|---|
| STP-013 | Positive | 45 cm |
| STP-014 | Negative | 45 cm |
Cultural material was found. See the positive tests above.
Every tag was filled.
A report template on the left and the page it writes on the right, from the shovel test in the form demo above. Mark STP-014 Positive up there and the last line here changes.
It was built for a bigger screen. On a phone it stacks into a long scroll.
Features I designed and built
I have been on the product since version 1, through version 2 and more than 25 releases since. These are some of the features I designed and helped build in the most recent ones.
Over the last year I also wrote about half of the web app’s commits and more than half of the mobile app’s. I owned the roadmap, the docs and the release notes and cut the iOS builds myself.
Version 3.0
February 12, 2026
Hydra, our proprietary offline-first sync at the edge. On Hugo’s engine I designed and built what crews see of it: sync status, recalling an earlier value and an event-based history of every edit, offline ones included.
Version 3.1
March 31, 2026
The calculation and conditional logic of the forms, calculated fields and conditional visibility, on Ripple, Hugo’s formula engine. LiveTrack. Annotation and measurement. QR codes and batch record creation. A redesigned records list and a QA table on the device.
Version 3.2
June 24, 2026
The redesign across web and mobile. Pipelines for advanced geospatial rasters: USGS 3DEP LiDAR flattened into digital elevation models, with hillshades lit from several directions or one the user picks. Historical topo and other raster layers.
Version 3.3
August 23, 2026
Nearby Sync’s experience and its icon. Camera Compass. Draw Mode and GeoTools on the web: trace, snap and shape history. Survey-grade positioning from the Emlid Reach RX2.
Part 3 of 3
How I got a firm to use it
A national firm moved more than twenty offices and practice groups onto Codifi at the same time. This is the cycle we ran with each of them and the AI agents that made it possible.
Then get a whole company to use it
In August 2024 Codifi was folded into its parent, Chronicle Heritage, a cultural resource management firm of more than 600 people working in all 50 states. Its offices ran fieldwork on web GIS, map apps, form builders and databases built by hand for each kind of project. My job became replacing all of it with one workflow, in more than twenty offices and practice groups at the same time.
That is a people problem more than a software one: a new tool costs good people time before it saves them any. So we built a cycle we could run with every team at once.

The cycle
- Deliverable inThe report or agency form the team has to produce, and the forms it uses today.
- An agent builds itThe composition, its forms and a demo project, set up in a sandbox for the team.
- They pick it apartThe team tries the demo against its own work, in a meeting with us.
- Recap and triageWhat changed and why, and a new demo. Back to step two until it fits.
- Into the fieldAnd when the product was the problem, the fix went to every team.
Around the cycle: training for crews and managers and site visits in Phoenix, Memphis and Pennsylvania. We moved more than 40 data models by API. What it came to is at the top of the page.
I had done this before, under a different title. Nine years as a pastor was nine years of helping people through change they did not ask for. The rest of that story is on the timeline.
Leading the company on AI agents
Bringing an office on used to mean weeks or months on a few databases across two or three offices. Twenty at once could not be done by hand. So I led how the company worked with AI. I was an early adopter. We were the AI incubator for our private equity firm’s portfolio companies.
It is what made the cycle above work. With agents I worked with up to twelve offices at a time and turned a database around in hours. Then the loop: fold in their changes, build a demo, send a triage of open questions and go again.
On a normal day I run up to nine repositories at once in Herder, each in its own space, with several tabs and several agents working different tasks in each. Since August 2025 that has come to more than 1,100 AI-assisted commits across the web and mobile apps.
What made it work was writing down what each project knows, in a form an agent can use: layered docs that say how the codebase works, what its conventions are and what not to touch. Then I taught the team to work the same way.

Three of us built it.
Codifi was built by a team of three, each covering what the others could not: what to build, how it works underneath, and whether it actually does.
Alex Voigt
Head of Product
Designed the product and its design system and wrote most of what you touch in it. Took a minimal first version, redid most of its early designs and led it to a company-wide rollout.
Hugo Bounoua
Solutions architect
Architected Hydra, the sync engine, and Ripple, the formula engine, and built much of the backend underneath them.
Jonathan Sims
Project manager
Ran the projects, the regression testing and QA, and the log of what users asked for, so each release started from what crews needed and was tested before it went out.
I would work with both of them again tomorrow. Hire us together and you get a team that has already taken a product from a crew’s request to the release that answers it. Hire any one of us and you get someone the other two will vouch for.
The demos on this page are mine. They do what Codifi’s public documentation says a crew will see and contain none of Codifi’s code.