Skip to main content

Deep Link Setup

Configure Colota instantly using a colota://setup URL. Generate a link or QR code with your server settings and share it with users - no manual typing required.

Fill in the settings you want to configure. Only the fields you set will be included - everything else keeps its current value on the device. All processing happens in your browser - no data is sent to any server.

Connection
Tracking
Sync
Authentication
Custom Headers
Custom Fields
Field Map
Geofences
Tracking Profiles

Fill in at least one field above to generate a setup link.

How It Works

  1. User taps the link or scans a QR code
  2. Colota opens and shows a confirmation screen listing all settings that will be applied
  3. Sensitive values (passwords, tokens) are masked in the preview
  4. User taps Apply Configuration to save or Cancel to discard
  5. Settings are persisted and the app navigates to the Dashboard

URL Format

colota://setup?config=BASE64_ENCODED_JSON

The config parameter is a base64-encoded JSON object. Only include the settings you want to change - everything else keeps its current value.

Parameter Reference

ParameterTypeDescription
endpointstringServer URL to send location data to
intervalnumberGPS polling interval in seconds (must be > 0)
distancenumberMinimum movement in meters before recording a new location
syncIntervalnumberBatch sync interval in seconds (0 = instant)
accuracyThresholdnumberDiscard locations less accurate than this (meters)
filterInaccurateLocationsbooleanEnable accuracy filtering
isOfflineModebooleanStore locally only, never sync
syncConditionstringany, wifi_any, wifi_ssid, or vpn
syncSsidstringWi-Fi SSID to sync on (only used with wifi_ssid)
apiTemplatestringcustom, dawarich, geopulse, overland, owntracks, phonetrack, reitti, or traccar
httpMethodstringPOST or GET
dawarichModestringsingle (OwnTracks endpoint) or batch (Overland endpoint). Only applies to apiTemplate: dawarich.
overlandBatchSizenumberPoints per batch POST for Overland format (1-500, default 50). Used by apiTemplate: overland and dawarich + batch.
fieldMapobjectCustom field name mapping for the JSON payload
customFieldsarrayStatic key-value pairs added to every payload
auth.typestringnone, basic, or bearer
auth.usernamestringUsername for Basic Auth
auth.passwordstringPassword for Basic Auth
auth.bearerTokenstringToken for Bearer Auth
customHeadersobjectCustom HTTP headers (e.g. Cloudflare Access)
geofencesarrayPause zone definitions (see Geofences)
profilesarrayTracking profile definitions (see Tracking Profiles)

Geofences

Each entry in the geofences array describes one pause zone. name, lat, lon and radius are required. Other fields fall back to safe defaults.

FieldTypeDefaultDescription
namestring(required)Display name
latnumber(required)Latitude in decimal degrees
lonnumber(required)Longitude in decimal degrees
radiusnumber(required)Radius in meters, must be > 0
enabledbooleantrueZone is active on import
pauseTrackingbooleanfalseStop saving locations inside the zone
pauseOnWifibooleanfalseAlso stop GPS while connected to Wi-Fi or Ethernet
pauseOnMotionlessbooleanfalseAlso stop GPS after no motion for motionlessTimeoutMinutes
motionlessTimeoutMinutesnumber10Minutes of stillness before motionless pause kicks in
heartbeatEnabledbooleanfalseSend periodic location updates while paused
heartbeatIntervalMinutesnumber15Heartbeat interval in minutes

Imported geofences are appended by default. The import confirmation screen has a "Replace zones with the same name" toggle that deletes existing zones whose names match before creating the incoming ones.

You can build links with geofences using the in-browser generator above, the Node.js or Python snippets below, or by sharing zones directly from the Geofences screen in the app (see the Geofencing guide).

Tracking Profiles

Each entry in the profiles array describes one tracking profile. name, interval, distance, syncInterval and condition are required. Other fields fall back to safe defaults. id and createdAt are ignored on import - the receiving device always creates fresh rows.

FieldTypeDefaultDescription
namestring(required)Display name
intervalnumber(required)GPS interval in seconds (must be >= 1)
distancenumber(required)Movement threshold in meters
syncIntervalnumber(required)Sync interval in seconds (0 = instant)
condition.typestring(required)charging, android_auto, speed_above, speed_below, or stationary
condition.speedThresholdnumber-Required for speed_above / speed_below. Speed in m/s (divide km/h by 3.6)
prioritynumber10Higher value wins when multiple profiles match
deactivationDelaynumber60Seconds to keep the profile active after the condition stops matching
enabledbooleantrueProfile is active on import

Imported profiles are appended by default. When both profiles and geofences are present the same "Replace ... with the same name" toggle on the import screen also deletes existing profiles whose names match before creating the incoming ones.

You can build links with profiles using the in-browser generator above, the Node.js or Python snippets below, or by sharing profiles directly from the Tracking Profiles screen in the app.

Using Node.js

node -e "
const config = {
endpoint: 'https://my-server.com/api/locations',
interval: 10,
apiTemplate: 'owntracks',
auth: { type: 'bearer', bearerToken: 'my-token' },
geofences: [
{ name: 'Home', lat: 52.52, lon: 13.405, radius: 100, pauseTracking: true }
]
};
const encoded = Buffer.from(JSON.stringify(config)).toString('base64');
console.log('colota://setup?config=' + encoded);
"

Using Python

python3 -c "
import json, base64
config = {'endpoint': 'https://my-server.com/api/locations', 'interval': 10}
encoded = base64.b64encode(json.dumps(config).encode()).decode()
print(f'colota://setup?config={encoded}')
"

Security Notes

  • The configuration URL is not encrypted. Avoid putting sensitive tokens in QR codes displayed in public.
  • All settings are shown to the user for confirmation before being applied.
  • Auth credentials are stored in AES-256-GCM encrypted storage on device after import.