
2026-08-10 version 1.0.3
- FIX: protect against a non-existing or unreadable ZDB (#579).
     The timezone16.bin has to be placed into the variable configured as
     TZDATADB in config.mk, assuming WITH_TZ is yes. For the Docker image,
     TZDATADB=/config/timezone16.bin meaning the file is searched in the
     /config volume. (New installations get that automatically, containers
     created pre version 1.0.2 might need manual intervention.

2026-08-09 version 1.0.2
- FIX: Makefile / config.mk.in remove dup libs
- UPD: packages will henceforth be built with WITH_KILL=no per default (#573)
- FIX: ocat --dump will not dump internal db names (#572)
- FIX: add referrer meta tag to maps (#570, #571)
- FIX: option --noskipdemo was incorrectly written as --skipdemo
- NEW: Support for Ubuntu 25.10
- NEW: Lookup timezone when a new location is recorded and store it (#561)
- UPD: old package signing key has been removed (#551)

2025-08-12 version 1.0.1
- FIX: ocat JSON output now supports emitting fields which are arrays/lists (#542)
- FIX: Add proper error message to revgeo lookup (#541)
- FIX: Replace use of access(2) in ocat(1) by opening config file (#539)
- NEW: Add support for OpenBSD (#523)
- FIX: storage dir from env even when the defaults file is missing (#528)

2025-03-19 version 1.0.0
- NEW: support for inline image data in a POI location publishes
- FIX: image2card.sh was creating invalid JSON (#520)
- UPD: deprecate google maps from vmap.html (#512)
- FIX: install unit file into /etc/systemd/system/ot-recorder.service during fpm (#514)
- FIX: fix permissions on files installed to share/docs/ot-recorder (#513)
- FIX: contrib/faces/github2card.py require TID
- FIX: contrib/faces/gravatar2card.sh require TID and replace MD5 by SHA256 for Gravatar
- FIX: contrib/faces/image2card.sh asks for TID to produce CARD
- UPD: changed 'convert' in image2card.sh to 'magick'
- FIX: consolidate raspbian/debian fpm-make invocations

2024-10-25 version 0.9.9
- FIX: OTR_CLEAN_AGE default not correctly handled (#500)
- FIX: ocat --dump will not output keys which don't have JSON data in them
- FIX: lowercase waypoints (otrw) and config (otrc) directory and filenames (#486)
- UPD: remove support for Greenwich devices (#484)
- FIX: avoid a JSON object copy
- FIX: print currently desired lmdb size in error that cache cannot be opened (#480)
- NEW: startup message hints at configured revgeo setting and reverse geocoder brand
- FIX: debian postinst now restarts ot-recorder (#446)

2024-07-23 version 0.9.8
- FIX: add card data to websocket notifications (#450)
- FIX: Enable building when WITH_TZ=no to disable timezone information (#473)
- FIX: view lastpos response (#471)
- FIX: handle out-of-order location notification in last/ (#472)
- FIX: drastically reduce memory leakage in views (#464)
- FIX: reformat json if it contains newlines/tabs before storing in .rec (#437)
- NEW: cached geo records can be auto-expired by setting OTR_CLEAN_AGE (#447)
- NEW: option -J prints variables in JSON format, for scripting
- NEW: version is printed in -J / -V
- FIX: in http mode friends' data must contain a topic; construct it or retrieve from last if available (#451)
- FIX: crash on non-string event name in _transition messages (#454)
- NEW: Add alt field to GeoJSON points parameters (#456)

2024-02-06 version 0.9.7
- FIX: Tour data (requests and submissions) contain corrupt data in .rec file
b/c of pretty-printing (#437)
- UPD: Change permissions (+r) on binaries (#428)
- NEW: Add support for dumping POI in GeoJSON format (#439)
- FIX: create {static,utils}/index.html to avoid directory listing
- FIX: remove HikeBike layer (and control) from views (#442)
- UPD: Autoload track in Recorder views / tours (#441)
- NEW: Optionally enhance API data with timezone at location's position (#444)
- UPD: locations API returns Recorder version number alongside count/status
- NEW: add experimental utility with which to enhance ghash/ with tzdata
- UPD: location and tzname are stored in ghash cache only if they're non-null
- UPD: Reduce default size of LMDB to 5368709120 (5GB); it can be configured via environment
- UPD: Improve gcache error handling
- FIX: Add missing OTR_HTTPPREFIX to ot-defaults (#440)

2023-10-24 version 0.9.6
- FIX: debian packaging

2023-10-24 version 0.9.5
- FIX: logs to stderr if DOCKER_RUNNING in environment (#426)
- FIX: typo in help descriptions (#423)
- NEW: Updated Google Timeline Import script (#407)
- UPD: Improve GPX-Import (#413)
- FIX: Table of Locations sorting issue (#415)

2022-12-09 version 0.9.3
- FIX: JS fixes for disappeared links (#406)
- FIX: instructions for building on FreeBSD 13.1 with TOURS configured (#405)

2022-09-30 version 0.9.2
- FIX: Remove accidental eval (#403)
- FIX: Various build fixes (#402)
- FIX: now compiles without MQTT (#401)
- FIX: read OTR_TOPICS from environment (overrides config); can be overriden by argv
- UPD: ocat -v shows compiled-in values, ot-recorder -V runtime ones
- FIX: add "OTR_HTTPPREFIX" (verbatim) to tour url if prefix unconfigured (#399)
- FIX: Duplicate log entries when running as daemon (#398)
- FIX: package build for raspbian

2022-08-10 version 0.9.1
- NEW: WITH_TOURS is built in by default
- NEW: Makefile now sets -DNS_ENABLE_IPV6 for IPv4 and IPv6
- NEW: tour views are written to and read from STORAGEDIR/tours
- NEW: add option --variables to ot-recorder to print list of all actual settings
- UPD: move config.js into docroot/utils/ to avoid having to proxy another uri
- NEW: @@@LABEL@@@ in view HTML is replaced by view's label attribute
- FIX: refactor environment variable handling for all settings. (#380)
- NEW: add very experimental shares functionality
- FIX: support OTR_HTTPHOST and OTR_HTTPPORT configuration in environment

2022-05-24 version 0.9.0
- NEW: OTR_LMDBSIZE can be set in the environment to define size of LMDB; bytes, min 10 MB (#348)
- UPD: modernize Recorder UI (not the actual Frontend project) (#386)

2022-03-14 version 0.8.8
- FIX: make secs time_t in otr_strftime() (#375)
- FIX: inaccurate logo name in manifest and missing image (#372)
- FIX: Alpine compiler warning on strncpy in geohash.c (#369)
- FIX: ocat outputs GeoJSON Feature with properties{} (#367)

2021-06-29 version 0.8.7
- UPD: Leaflet GeoJSON map point popups now contain accuracy if available (#352)
- FIX: prefix Content-Length by X- to avoid issues with chunked encoding #350
- FIX: fix off-by-one error introduced in #328 (Safari only)

2020-03-10 version 0.8.6
- FIX: default views directory results in view not found (#338)

2020-03-09 version 0.8.5
- FIX: OTR_CAPATH wasn't recognized in defaults (#336)
- UPD: support for Debian 10 (Buster) packages
- FIX: compilation with HTTP=no
- FIX: compilation with WITH_MQTT = no and WITH_HTTP = yes (#308)
- NEW: ot-recorder option --viewsdir overrides <docroot>/views (#305)
- FIX: fix misleading error message (#302)
- UPD: document that user/device names are always lowercased (#300)
- FIX: fix unused result warning on debian stretch, (fixes #290)
- FIX: Leaflet map and view wrap around antimeridian (±180°) #293


2019-02-20 version 0.8.4
- FIX: Post-installation script fails (#291)
- NEW: revgeod is queried with &app=recorder
- UPD: Add `acc` field to GeoJSON point feature properties (#283)

2019-01-11 version 0.8.3
- FIX: lat,lon in leaflet views
- FIX: fix paths to be relative to docroot for map/, views/, and  last/
- FIX: Link to location in table/ now uses OSM, our default (#278)

2019-01-10 version 0.8.1
- FIX: ensure geohash is sent down the tube in http
- FIX: environment variable OTR_GEOKEY overrides defaults config (#277)
- UPD: Surface GEOCODE_TIMEOUT into config.mk (#272)
- FIX: Correctly calculate time differences (#271)

2018-11-24 version 0.8.0
- FIX: local leaflet.js installation (#269)
- FIX: swapped lat/lon in last/ (#268)
- NEW: support for revgeod (#263)
- UPD: remove bundled MDB
- UPD: increased LMDB mapsize (#253) This increases the maximum size of the LMDB in place

2018-09-01 version 0.7.9
- NEW: support for OSM on live map, by @avanc (#244)
- FIX: compilation on gcc 8 no longer warns about truncated strings (#242)
- FIX: remove deprecated signed_in in Google maps
- UPD: Use OpenCage geocoder for reverse geocoding (#202)
- NEW: Support for OpenCage in Lua

2018-04-30 version 0.7.6
- NEW: contrib/freebsd/  notes and rc (#229)
- NEW: View using Leaflet (#226)
- FIX: CAPATH or CAFILE set TLS (#232)

2018-02-13 version 0.7.5
- FIX: ocat --list now works also on file systems which don't support dtype (xfs)

2018-02-12 version 0.7.4
- FIX: fpm-make for Debian to pull in correct libsodium package (thanks @juzam!) 

2018-02-12 version 0.7.3
- FIX: GPX exporter gets xmlns (#215)
- FIX: wait on start of systemd to allow Mosquitto to start (#185)
- FIX: s/json_remove_from_parent/_delete/g
- NEW: Add support for OwnTracks Pico by pretending `../pico` is a base topic (#205)
- UPD: rollback: cards are now once again stored at user/device/user-device.json (but map/table also uses user/user.json if it exists)

2017-05-19 version 0.7.2
- FIX: ping/ping monitoring user/device no longer shows up on map nor in table (#195)
- FIX: OTR_CAFILE, KEYFILE, CERTFILE are now also read from config file (#198)
- NEW: support Traccar (osmand) GET requests

2017-05-17 version 0.7.1
- FIX: systemd launch and default topics in default files (#185)

2017-05-17 version 0.7.0
- NEW: name of Lua revgeo function can be set in JSON payload
- NEW: support TLS PSK (#74)
- NEW: support for a Lua function to perform reverse Geo (#149)
- FIX: support for FREEBSD in Makefile/config.mk.in (#163)
- NEW: support for global store of geo fences (#178)
- NEW: support for CA_PATH and TLS client certificates
- FIX: setting http_port = 0 took CPU to unheard heights (#176)
- NEW: Add support for OSM using Leaflet, by Sven Klomp (#173)
- NEW: support for waypoints / geo-fences (WARNING: you must --initialize)
- FIX: built-in Web server serves apikey.js with application/javascript mime type (#168)
- FIX: Usage now shows missing OTR_BROWSERAPIKEY (#167)

2016-11-25 version 0.6.9
- UPD: REC files now use tst from JSON payload as timestamp (#133)
- FIX: default file is /etc/default/ot-recorder
- FIX: add support for $OTR_BROWSERAPIKEY from environment (#156)
- UPD: packages now have API kill in them (#153)

2016-09-23 version 0.6.8
- UPD: name on live map can be overriden by 'name' in JSON payload
- NEW: decrypted payloads have "_decrypted":true added to .rec file (#151)
- NEW: new configuration variable OTR_BROWSERAPIKEY (#146)
- FIX: Maps browser API key file (apikey.js) is now served by the Recorder (#146)
- FIX: add CFLAGS for base64 to conver Arch (#128)
- FIX: if defaults file can't be read, log an error (#131)
- NEW: otr_publish() from Lua reuses Recorder's authenticated, TLS-enabled MQTT connection (#140)
- UPD: changed systemd unit file (#137)
- UPD: README restructured (#138)
- NEW: ocat -v and api/0/version now show git version/commit
- FIX: Debian package dependency on libsodium13

2016-07-20 version 0.6.7
- FIX: don't crash on null payloads

2016-07-19 version 0.6.6
- FIX: FreeBSD locations api: reset isdst for mktime(3) (#125)
- FIX: apikey support for last/, map/, and views/ (#124)
- FIX: don't clobber CFLAGS from config.mk
- FIX: debian/centos package now automatically installs systemd service (thanks Tomas Lastovick for making us do this :)
- FIX: centos packages now also install binaries to /usr

2016-05-30 version 0.6.5
- FIX: paths to binaries

2016-05-30 version 0.6.4
- FIX: revert debian config file location

2016-05-30 version 0.6.3
- FIX: views now have a favicon (#121)
- NEW: Table and Map now have vel and cog (#117)
- FIX: Table now correctly defaults to last 2 chars of topic for tid (#120)
- FIX: views no longer accumulate devices; the list is cleared on reload (#107)
- FIX: CSV publishes work in spite of CR at end of string (#119)
- NEW: native Debian packaging (#114)
- FIX: check whether $OTR_CAFILE can actually be opened (#109)
- FIX: image2card fixed base64 wrapping (#111)
- FIX: key for decrypting payload is now correctly lowercased from user/device
- FIX: negative lat/lon in CSV payloads
- FIX: nested object in payload no longer crashes in Lua hooks
- UPD: LWT are now stored with reltopic == 'lwt' instead of '*' (#101)

2016-03-07 version 0.6.2
- FIX: ocat CSV and XML output fixed
- UPD: _geoprec may be < 0 to prevent new geo lookups
- FIX: adapted build & recorder for FreeBSD 10.2 (isnan() macro)

2016-03-04 version 0.6.1
- NEW: received payload may contain _geoprec:N to override precision (#58)
- FIX: view's page returns content-type

2016-03-04 version 0.6.0
- UPD: view can specify hours instead of from/to (#99)
- UPD: recorder and config option HTTPLOGDIR for access.log

2016-03-03 version 0.5.9
- UPD: messages received over http have _http:true added to JSON
- UPD: http publishes are displayed with grey user in Table

2016-03-02 version 0.5.8
- FIX: topic missing in last/

2016-03-02 version 0.5.7
- FIX: linestring map shows position only; no longer broken date (#97)
- FIX: Greenwich alarms were stored in last/ as ../alarm
- UPD: attempt CARD retrieval first from user/device/u-d.json (#94)
- UPD: option --skipdemo renamed to --noskipdemo

2016-03-01 version 0.5.6
- FIX: gwstorage lowercase username & device (#96)

2016-03-01 version 0.5.5
- FIX: MQTT topics on command line override those in config file
- NEW: API supports track for CTRL

2016-02-26 version 0.5.4
- UPD: MQTT can be disabled even if compiled-in
- UPD: ship README and service file in /usr/share/doc/ot-recorder/
- UPD: ocat -v displays path to config file
- FIX: ocat should process only part of config file

2016-02-25 version 0.5.3
- FIX: mqtt user/pass from config file

2016-02-25 version 0.5.2
- UPD: defaults file now contains most config settings
- UPD: ocat -v explicitly shows yes/no for MQTT/HTTP
- NEW: hooks in httpmode
- REM: r-only mode removed
- FIX: squashed a number of memory leaks
- NEW: encryption in responses of httpmode
- UPD: API supports GPX output
- NEW: friends (locations, cards) in http mode
- UPD: LMDB is no longer optional during build
- UPD: remove Hosted mode (#86)
- NEW: HTTP mode
- UPD: remove support for /msg
- UPD: startup log message includes version

2016-02-18 version 0.5.1
- FIX: RHEL postinstall shoud run on update as well

2016-02-17 version 0.5.0
- FIX: License: GPL2 (#18)
- NEW: view contains CARD's avatar if available, as does last/
- FIX: map heights _ought_ to now be ok, also on mobile devices
- NEW: small utility for creating view auth
- NEW: support for VIEWs with optional digest authentication
- NEW: gravatar2card.sh and github2card.py in contrib/faces
- FIX: use of limit in locations api

2016-02-09 version 0.4.9
- NEW: introduce /etc/default/ot-recorder
- UPD: GPX output now contains elevation and UTC time
- UPD: default --label on live map changed from "Recorder" to "OwnTracks"
- NEW: optional rename of topics in map popups (#79)
- FIX: mongoose correctly identifies changed files (304 vs 200 and Etag)
- NEW: points on GeoJSON map are now clickable for infowindow (#78)
- NEW: GeoJSON points now have tst in properties (#78)
- FIX: map with extra info in popup box (#77)
- NEW: packaging for Centos7
- NEW: ot-recorder --debug
- FIX: ocat version shows libmosquitto and sodium versions

2016-01-27 version 0.4.8
- FIX: finish Debian8 packaging
- FIX: add missing entry to reason table which could cause SIGSEGV
- FIX: add public domain base64.[ch] (#18)
- NEW: experimental support for payload decryption with per/user secret keys
- FIX: ignore SIGPIPE
- NEW: API endpoint /version returns Recorder version

2016-01-11 version 0.4.7
- NEW: Beacon messages are now handed to the Websocket server
- UPD: locations API returns data in `data` (no longer in `locations`)
- NEW: google reverse-geo API key is now a run-time option in recorder (#18)
- FIX: table view shows last voltage for Greenwich devices in battery column (#73)
- FIX: normalize acc to double for older device versions
- NEW: API locations/ now has support for CSV (#72)

2015-11-13 version 0.4.6
- NEW: support batt,ext,status in LAST API for Greenwich device firmware
- FIX: reverse geo lookup limited to 2000ms
- FIX: make install now creates STORAGEDEFAULT/last (#67)
- FIX: documentation update to include instructions for building on Ubuntu 14.04

2015-11-04 version 0.4.5
- NEW: LAST and LOCATIONS return additional human-formatted ISO timestamp for display, disptst
- FIX: otrc dump now contains correct configuration settings which can be restored to phone
- FIX: waypoints/config filename extention fixed (otrw/otrc)
- NEW: extra.json (in last/username/device/) is merged in and returned in API (#60)
- FIX: http server sets utf-8 on JSON responses (API)
- NEW: recorder's --norec disables writing REC files
- FIX: removed Mosquitto loop timeout; great improvement in HTTP performance
- NEW: API supports /last ?fields=a,b,c

2015-10-23 version 0.4.4
- FIX: now actually builds without LMDB (not recommended!)
- NEW: Add a battery level column to the Table. (#56)
- FIX: waypoints and config dumps are prettyfied
- FIX: XML output prints empty tags when fields are requested
- NEW: API photo/ endpoint (returns default png on user 404)
- NEW: configuration dump (cmd dump) is stored in store/config/$user-$device.otrc
- NEW: waypoints dump (Publish Waypoints from device) written to store/waypoints/$user/$device/user-device.otrw

2015-10-19 version 0.4.3
- NEW: recorder exits if Lua script cannot be loaded (#54)
- FIX: add fail-safe to CSV parser (#53)
- FIX: GeoJSON LineString tracks are now sorted by tst and not by received date
- FIX: recorder's default label correctly set if not compiling with WITH_LUA (#50)
- FIX: Re-zoom map on autozoom enable (#51)
- NEW: favicon/logo, thanks to @ckrey (#50)
- NEW: contrib/faces/image2card.sh to publish a Recorder-compatible JSON CARD from photo
- NEW: multilister adds username/device to JSON location data (#49)

2015-10-02 version 0.4.2
- FIX: ocat --format csv outputs addr and locality as quoted strings
- NEW: live map has a label (set with ot-recorder --label) to indentify instance; connection status is border
- NEW: live map has toggle button to auto-fit (zoom)
- NEW: live map fits to show all devices (#46, #47) with &fit=1 (#48)
- NEW: recorder --initialize non-destructively creates databases (#45)
- INT: added multilister (not yet surfaced to API) (#36)
- FIX: index.html uses UTC to go back in time (reported by Ben)
- NEW: recorder can use Lua otr_putrec() to prohibit REC file writing (#27)
- FIX: storage removes waypoints on kill (#34)
- FIX: storage removes photo on kill (#30)
- FIX: exit if HTTP port cannot be opened
- FIX: lowercase T in date formats allowed (#44)
- FIX: websockets switch to WSS when content served over HTTPS (#43)
- FIX: live map now shows user/device (#42)

2015-09-26 version 0.4.1
- FIX: recorder correctly handles topics with leading slash
- NEW: Lua functions (putdb, getdb) have access to a `luadb'-named LMDB database
- NEW: Lua hooklets
- UPD: reverse geo JSON data in lmdb now contains locality (unless null)
- UPD: ocat --load can delete individual keys from lmdb
- NEW: recorder uses topic2tid named database for on-the-fly TID replacements in JSON payloads

2015-09-21 version 0.4.0
- NEW: ot-recorder stores received (shared) waypoints in waypoints/
- NEW: ot-recorder --quiet to disable info on stdout
- FIX: full rewrite of on_message(); needs testing!
- FIX: recorder logs MQTT connection request
- FIX: Lua's otr_exit is now invoked on exit
- FIX: SIGINT and SIGTERM gracefully stop the recorder
- NEW: Lua hook support
- FIX: kill now removes card and its containing directory if available

2015-09-15 version 0.3.0
- FIX: ocat lowercases device/username (reported by tiptronic)
- NEW: XML support in storage and ocat --format xml
- FIX: display (lat,lon) in table if no address available
- FIX: nasty memory leak in locations from storage
- FIX: LAST now carries isotst
- FIX: ocat --last now supports CSV output (with fields)
- NEW: demo data in etc/ with description
- NEW: index.html has links to -12h, -7d, and -30d for convenience
- NEW: add API q= to query geo cache for particular lat,lon
- FIX: close two memory leaks
- NEW: add systemd unit file

2015-09-15 version 0.2.9
- FIX: added API description and diagram to documentation
- NEW: kill has been surfaced into the API (disabled by compile flag by default)
- FIX: kill now also deletes LAST file and its parent directories if empty
- NEW: ocat --load-ghash can load revgeo db
- NEW: ocat --dump-ghash dumps content of revgeo db
- FIX: main index now shows users/devices already in storage

2015-09-14 version 0.2.8
- FIX: undo ocat -v change

2015-09-14 version 0.2.7

- FIX: ocat -v correctly displays configured JSON_INDENT
- FIX: spec file now builds packages on OBS

2015-09-14 version 0.2.6

- FIX: source of doc root renamed to docroot

2015-09-14 version 0.2.5

- FIX: renamed wdocs to htdocs
- FIX: updated spec file and renamed defaults
- FIX: log with which clientID user is connecting to Hosted
	to aid in trouble-shooting

2015-09-13 version 0.2.4

- FIX: incorrect install of wdocs/ (thanks to @rk295)
- FIX: use correct hostname for --hosted mode
- FIX: live map had ugly HTML on hover-over point

2015-09-11 version 0.2.3

- NEW: --hosted mode for recorder

2015-09-11 version 0.2.2

- first public release
