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.

  • Android 8+ & iOS
  • Indonesian language
  • Data on your own server
Airplane modeOn — everything saved locally
16:20No signal

My data

2 submission not sent yet

1

Sent

2

Waiting

1

Action

  • Warung Bu Tuti

  • Kios Sayur Pak Endang

  • Toko Bahan Kue Melati

  • Bengkel Motor Jaya

Forms
My data
Settings

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. 1

    An admin builds the survey

    Questions, validation, and pagination are assembled as a form in the admin panel. No developer needed.

  2. 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. 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. 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.
The Submissions page in the Titen admin panel
Submissions. Every record carries its capture time, enumerator, form, and the form version used.
The Forms page in the Titen admin panel
Forms. New surveys are built and published here, without waiting for the next app release.

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.