Project sync
A whole GeoPackage project, released to a crew and collected into by all of them at once.
The shape of it
The file is the record. It is not the transport.
A Mapit project is a GeoPackage: one file holding the layers, the forms behind them and everything collected into them. When a project goes to the cloud that file stays what it is, and the copy on the server is the one everybody converges on. Nothing is shredded into a database that can only be read back through us, which is why the answer to “can we have our data” is a download rather than a support ticket.
What travels is not the file. A phone that already holds the project sends the rows it changed and receives the rows everybody else changed, so the first sync moves a project and every sync after it moves a conversation. That is why the second sync and the two hundredth are both small, and why a crew on a thin connection at the end of a long day gets their work away rather than watching a progress bar.
Two people, one feature
Merging happens field by field, not row by row
Two surveyors open the same lamp post. One corrects the height, the other records the lamp type. Row-level sync makes that a fight and one of them loses their afternoon; here both land, because the server works out which columns actually changed and applies each one. The geometry counts as a single field, since half a position is not a position.
When the same field really is set to two different values, the first to reach the server stands. That rule is chosen rather than convenient: the alternative is letting a device clock decide, and phone clocks are wrong often enough that “the later edit wins” quietly means “whoever’s time zone was mis-set wins”.
The discarded value is not discarded. It becomes a conflict record carrying both sides, which device sent each and when, and a manager reviews them in the portal. A sync may make a decision; it may never make work disappear. Editing a feature somebody else deleted is the same story from the other end: the deletion stands and the edit is kept, rather than a row quietly coming back to life.
Week two
A new field reaches every phone without anybody downloading the job again
Jobs change. In week two somebody needs a column that was not in the original form, and on most systems that means a new file for everybody and an evening of making sure nobody is still holding the old one. Here a manager edits the structure, releases it, and the change travels as a patch: the phones apply the new column and keep everything already in them, including work collected that morning and not yet sent.
Additive changes go through. Renaming a field, retyping one, or dropping a layer that people are still collecting into is refused at release with the reason, because those are the changes that strand work, and a refusal you can read beats a migration you discover afterwards.
On the ground
Offline is the normal case, not the failure case
The app works with no account and no signal; it did before any of this existed. Sync is something the project does when there is a connection worth using, and nothing about collecting waits on one. A push is never refused because a project is close to its size limit either: the crew did not set the quota, and destroying a day of fieldwork over somebody else’s billing rule is not a trade we are willing to make. The manager gets warned instead.
Worth knowing
What it does not do
It is not real time
Nothing updates while a phone is out of signal, and no screen pretends otherwise. Every figure carries the time it was true.
Photographs stay on the phones
A photo's details travel with its feature: its name, size, checksum and which feature it belongs to. The file itself never leaves the phone that took it.
One project at a time per draft
Structure changes are made in a draft against a known release. Two people reshaping the same project at once is refused rather than merged.
Android and the web today
The iOS app is not released yet, and the QGIS plugin, for viewing projects, is released with Mapit Cloud.