No description
Find a file
2026-06-04 08:03:37 +01:00
static Switch map tiles to Stadia Maps Alidade Smooth Dark 2026-06-04 08:03:37 +01:00
Dockerfile Initial commit: Breadcrumb GPS trip viewer 2026-06-03 19:34:08 +01:00
go.mod Initial commit: Breadcrumb GPS trip viewer 2026-06-03 19:34:08 +01:00
go.sum Initial commit: Breadcrumb GPS trip viewer 2026-06-03 19:34:08 +01:00
main.go Initial commit: Breadcrumb GPS trip viewer 2026-06-03 19:34:08 +01:00
README.md Initial commit: Breadcrumb GPS trip viewer 2026-06-03 19:34:08 +01:00

Breadcrumb

A self-contained Go server that receives GPS location data from the Colota Android app, stores it in an SQLite3 database, and serves a web frontend for browsing trips on a map.

Quick Start

# Build
go build -o breadcrumb .

# Run (no auth, default port 8080, db = ./locations.db)
./breadcrumb

# Run with Bearer token auth on port 443
./breadcrumb -port 443 -token mysecrettoken -db /var/data/locations.db

Flags

Flag Default Description
-port 8080 HTTP listen port
-db locations.db Path to the SQLite3 database file
-token (empty) Bearer token for auth. Empty = authentication off.

API

POST /api/location ← Colota app sends here

Headers: Content-Type: application/json

Body (Colota default payload):

{
  "lat":  51.495065,
  "lon":  -0.043945,
  "acc":  12,
  "alt":  519,
  "vel":  0,
  "batt": 85,
  "bs":   2,
  "tst":  1704067200,
  "bear": 180.5
}
Field Type Required Description
lat float Latitude (decimal degrees)
lon float Longitude (decimal degrees)
acc float Accuracy (metres)
tst int Unix timestamp (seconds). Falls back to server time.
alt float Altitude (metres)
vel float Speed (m/s)
bear float Bearing (degrees, 0360)
batt int Battery level (0100 %)
bs int Battery state: 0=unknown 1=unplugged 2=charging 3=full

GET variant is also supported (query parameters with the same field names).

Returns: 200 OK on success.


GET /api/locations ← Query stored locations

Param Default Description
limit 100 Max records to return (up to 500 000)
page 1 Page number (1-based)
from Filter: Unix timestamp lower bound
to Filter: Unix timestamp upper bound

Response:

{
  "total":   42,
  "page":    1,
  "limit":   100,
  "records": [ { "id": 1, "lat": 51.495065, "lon": -0.043945, ... } ]
}

GET /api/trips

Returns location points grouped into trips (gaps > 30 min = new trip), newest first.


GET /health

Returns server status and total location count.


Colota App Configuration

  1. Open Colota → Settings → API Settings
  2. Select template: Custom
  3. Set Endpoint URL to http(s)://your-server:8080/api/location
  4. HTTP Method: POST
  5. If using a token: set Authentication → Bearer Token to your -token value
  6. Leave field mapping at defaults
  7. Tap Test Connection — you should see 200 OK

Docker

docker build -t breadcrumb .

docker run -d \
  --name breadcrumb \
  -p 8080:8080 \
  -v breadcrumb-data:/data \
  breadcrumb -token "$TOKEN"

Database Schema

CREATE TABLE locations (
  id          INTEGER PRIMARY KEY AUTOINCREMENT,
  lat         REAL    NOT NULL,
  lon         REAL    NOT NULL,
  acc         REAL    NOT NULL,
  alt         REAL,
  vel         REAL,
  batt        INTEGER,
  bs          INTEGER,
  tst         INTEGER NOT NULL,   -- Unix timestamp
  bear        REAL,
  received_at TEXT    NOT NULL    -- ISO-8601 UTC
);
CREATE INDEX idx_locations_tst ON locations(tst);