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 /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