Offline-first · self-hosted
Signal can drop.
Your field data can’t.
Titen is a field survey app that treats on-device storage as the source of truth. Enumerators fill forms, take photos, and mark coordinates with no connection at all, and syncing runs on its own the moment signal returns.
Warung Bu Tuti
Kios Sayur Pak Endang
Toko Bahan Kue Melati
Bengkel Motor Jaya
Try switching airplane mode off and on: the queue clears itself.
0%
data lost across 200 test submissions
100%
of forms fill with no connection
< 2 s
from launch to a form ready to fill
≥ 95%
of auto-syncs succeed unattended
THE PROBLEM ISN’T SIGNAL
Survey apps usually assume the network is always there
The moment a connection fails, a network failure turns into a storage failure. Staff fall back to paper, which adds a re-entry step where mistakes creep in.
WHAT USUALLY HAPPENS
- Forms fail to save because they wait on a server response
- The session expires in the field, the app logs out, and local data goes with it
- Enumerators can’t tell which records actually arrived
- A new survey means waiting for the next app release
WITH TITEN
- Every submission is written to the local database before it touches the network
- An expired token flags “sign in again” and never deletes anything
- Every submission’s status sits in one list, nothing to hunt for
- A new survey is just a change in the admin panel, with no app release
FEATURES
Built on one assumption: connectivity is a bonus
Fully offline data entry
Every interaction is served from SQLite on the device. No button ever waits on the network, and there is no “no connection” banner: offline is the normal state.
Dynamic forms, no release
Fields, validation, conditional logic, and pagination all come from JSON. Adding a 12-question survey is configuration work, not release work.
Outbox-based sync engine
A mutation queue with per-item status, retries with exponential backoff, and a single-flight lock. The submission endpoint is idempotent on the client UUID, so a duplicate send never creates duplicate data.
Separate photo queue
Photos are compressed to 200–500 KB before queueing and upload on their own track, so a submission is never held hostage by one large file. Local copies are deleted once the upload is confirmed.
Verifiable photos & coordinates
Each point is stored with its accuracy value and capture time, so supervisors can judge whether staff were really on site. Poor accuracy raises a warning; it never blocks saving.
Status you never have to hunt for
A submission always has exactly one status, written in words field staff understand. The counts sit in the list header, and anything needing attention carries its own button.
HOW IT WORKS
Four steps, one of which runs without you
- 1
An admin builds the survey
Questions, validation, and pagination are assembled as a form in the admin panel. No developer needed.
- 2
The enumerator downloads once
One connection at the office is enough: forms and region data are stored on the device, and the session lasts 90 days.
- 3
Collecting in the field
Fill the form, take photos, mark coordinates, all without a connection. Drafts save automatically on every change and survive a sudden crash.
- 4
Syncs itself when signal returns
As soon as connectivity is back the queue runs on its own: the latest forms are pulled, submissions go one by one, and photos follow on a separate track.
ADMIN PANEL
The web side where supervisors work
Incoming submissions, photos still uploading, registered devices, and survey forms are all managed from one panel on your own server.
- Pattern search with
field:value, saved filters, and CSV export. - Roles, permissions, a device list, and an operation log for internal audits.


WHO IT’S FOR
Three roles, three different needs
ENUMERATOR
“Don’t lose what I already filled in”
A target of 15–30 respondents a day, a battery that must last 8 hours, and a nearly full phone. What they need: visible proof the data is saved, and an entry flow with as few taps as possible.
SUPERVISOR
“Who has submitted how much?”
Tracking 5–15 staff from an internal panel: what came in, what failed to sync, and coordinates to verify staff were really on site.
SYSTEM ADMIN
“A new survey, today”
Defining a form and distributing it without waiting on a developer. An invalid form is rejected by the panel with a clear message, not by a crash in the field.
ARCHITECTURE
Your data stays on your infrastructure
The whole system runs as Docker containers on your own server. The admin panel and the mobile API are two separate binaries: the panel can live on an internal network, and a bug there never takes down the path data arrives through.
- api: public, only five endpoints, keeps serving even if the panel is down
- admin: the supervisor panel behind a VPN or IP allowlist
- migrate: a run-once job, so two services never migrate at the same time
- PostgreSQL for data, MinIO for photos, both yours
USERS
Enumerator
Android & iOS, offline
Supervisor
Admin panel on the web
sync · HTTPS
SERVER · DOCKER
api
public, 5 endpoints
admin
VPN / allowlist
migrate
run-once job
PostgreSQL
submissions & forms
MinIO
photo storage
What’s missing, on purpose
There is no multi-tenancy, analytics dashboard, offline map, barcode scanner, or digital signature yet. Depth on the two things that decide the product, the sync engine and data consistency, came before breadth of features.
Try it yourself in airplane mode
Install the test build on Android or iOS, turn off the connection, and fill in a few submissions. If it fits your agency or client, the whole system can be handed over with its pipeline and documentation.
APK via Google Drive, iOS via TestFlight.