diff --git a/README.md b/README.md
index 1aa1d5b..6903163 100644
--- a/README.md
+++ b/README.md
@@ -306,7 +306,7 @@ The aims is to provide a ready-to-run recipes that you can just copy, paste and
- [Penpot](apps/other/penpot.md)
- [VPN client](apps/other/vpn.md)
- [OpenSpeedTest](apps/other/openspeedtest.md)
-
+- [Traccar location tracker](apps/other/traccar.md)
# Photos
- [Comparison table](apps/photos/comparison.md)
diff --git a/apps/other/traccar.md b/apps/other/traccar.md
new file mode 100644
index 0000000..58f8dd4
--- /dev/null
+++ b/apps/other/traccar.md
@@ -0,0 +1,199 @@
+# Traccar
+
+![traccar_hu4f4d748acb69c0f52e2340aac180cda5_35275_1600x0_resize_box_3](https://user-images.githubusercontent.com/52239579/212997283-e3279b61-189f-452c-86e5-d1e2fe216da2.png)
+
+**Traccar is a gps tracking system. You can use it to monitor your smartphone location history**
+
+
+
+[website](https://www.traccar.org/)
+
+[documentation](https://www.traccar.org/documentation/)
+
+## get the default traccar conf
+
+`docker run --rm --entrypoint cat debian-traccar-nginx:latest /opt/traccar/conf/traccar.xml > /run/media/ippo/TOSHIBA/traccar/conf/traccar.xml`
+
+## Configuration parameters for MySQL
+(replace [DATABASE], [USER], [PASSWORD] with appropriate values from docker-compose replace [HOST "IPv4Address" from db_name section in docker network inspect)
+
+```
+com.mysql.cj.jdbc.Driver
+jdbc:mysql://[HOST]:3306/[DATABASE]?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true&autoReconnect=true&useUnicode=yes&characterEncoding=UTF-8&sessionVariables=sql_mode=''
+[USER]
+[PASSWORD]
+```
+
+## docker-compose
+
+```
+version: "3"
+
+services:
+ traccar-db:
+#yobasystems was used for its compact size. also it survives recomposing and does not throws innodb error when volumes are not empty as the official mariadb image does
+ image: yobasystems/alpine-mariadb
+ container_name: traccar-db
+#auth plugin for old drivers
+ command: --default-authentication-plugin=mysql_native_password
+ restart: always
+ volumes:
+# mount /var/lib/mysql and /etc/mysql/conf.d on host
+ - /run/media/ippo/TOSHIBA/traccar/mysql-data:/var/lib/mysql
+ - /run/media/ippo/TOSHIBA/traccar/mysql:/etc/mysql/conf.d
+ ports:
+ - "3306:3306"
+ environment:
+#use those in the traccar config file in /opt/traccar/conf/traccar.xml as mounted in host
+ - MYSQL_ROOT_PASSWORD=rootpassword
+ - MYSQL_DATABASE=traccar-db
+ - MYSQL_USER=username
+ - MYSQL_PASSWORD=userpassword
+ networks:
+ - trc2
+
+
+ traccar:
+ image: traccar/traccar:debian
+#create an account to a dynamic dns provider e.g. duckdns then reverse proxy it to localhost:traccar_port e.g. with caddy. Caddyfile is dead simple
+ hostname: a_ddns_domain_name
+ container_name: traccar
+ depends_on:
+ - traccar-db
+ restart: always
+ volumes:
+#get the default traccar conf
+#then replace the embeded h2 db conf with "mysql" conf
+#https://www.traccar.org/mysql/
+#get the network subnet and ip
+#docker network inspect network_name in the database section
+#use the ip in the [hostname] section of the database url database.url'>jdbc:mysql://[HOST]/[DATABASE]?
+ - /run/media/ippo/TOSHIBA/traccar/conf/traccar.xml:/opt/traccar/conf/traccar.xml:ro
+ - /run/media/ippo/TOSHIBA/traccar/logs:/opt/traccar/logs:rw
+ ports:
+#android client needs tcp 5055 port so if you dont plan to use any of the supported hardware gps trackers
+#you can skip listening to 5002,5093 tcp/udp ports and only keep 5055 for events and 8082 for the webui
+ - "5055:5055"
+ - "82:8082"
+ networks:
+ - trc2
+networks:
+ trc2:
+ driver: bridge
+ enable_ipv6: false
+ ipam:
+ config:
+#get the network subnet
+#docker network inspect network_name
+ - subnet: 192.168.112.0/20
+```
+
+## open root mysql shell create database, charset and priviledget user
+
+`docker exec -it traccar-db mysql -u root -p`
+
+`CREATE DATABASE IF NOT EXISTS traccar-db`
+
+`grant all privileges on traccar-db.* TO user'@'% identified by pass`
+
+`flush privileges`
+
+`ALTER DATABASE traccar CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ciALTER DATABASE traccar CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`
+
+`\q`
+
+## reverse proxy
+
+i recoment to use caddy for reverse proxy and automatic ssl manager
+
+`nano /etc/caddy/Caddyfile`
+
+`a.random.ddns.name.duckdns.org {
+ reverse_proxy localhost:82
+}`
+
+## backup and restore traccar mysql
+
+backup
+
+`docker-compose -f compose-file.yml exec dbname mysqldump -uroot -pYOUR_MARIADB_ROOT_PASSWORD --all-databases > dump-$(date +%F_%H-%M-%S).sql`
+
+restore
+
+`docker-compose -f compose-file.yml exec -T dbname mysql -uroot -pYOUR_MARIADB_ROOT_PASSWORD < mariadb-dump.sql`
+
+## android apps
+
+[Android client app](https://www.traccar.org/client/)
+
+On client app While service is deactivated Copy the identifier, Insert the server URL (your dens,domain), Select location accuracy (high), Select frequency report ~120 sec, disable wakelock and enable the service
+
+On status verify that the location is updating
+
+[Android manager app](https://www.traccar.org/manager/)
+
+On server Top left menu Select the plus icon to add a device Select a random name And the identifier from the client app And save
+
+The you can select the device on the top left menu
+
+![Screenshot_20230117-214656_Traccar Manager](https://user-images.githubusercontent.com/52239579/212997717-452c1e22-b244-4f50-8806-a61daa2a9485.png)
+
+
+## Migrate google location history takeout to traccar
+
+[download your google maps location history takeout](https://takeout.google.com/takeout/custom/local_actions,location_history,maps,mymaps?)
+
+select location history only
+and json as format
+extract the Records.json
+
+you'll use a python script to limit the resaults to just time , latitude and longitude converted to proper coordinates
+
+`git clone https://github.com/Scarygami/location-history-json-converter`
+
+`cd location-history-json-converter`
+
+`pip install -r requirements.txt`
+
+`python location_history_json_converter.py Records.json output.csv -f csv`
+
+csv output will generate Comma-separated text file with a timestamp field and a location field
+we'll add a deviceid , protocol and valid fileds to it
+
+`sed 's/^/osmand,1,/; s/$/,1/' export.csv > curated.csv`
+
+delete the "1" from the first line an replace osmand with protocol in the first line
+
+so now the file looks like
+
+```
+protocol,Time,Latitude,Longitude
+osmand,1,2012-08-25 21:26:20,37.95954620,23.72793730,1
+```
+
+5 columns
+osmand
+1
+time
+lat
+lon
+
+We are going to parse those values to as sql `LOAD DATA LOCAL INFILE` statement to the appropriate tc_position table fields
+
+copy the csv to the container
+
+`docker cp curated.csv traccar-db:/`
+
+open a root mysql shel to the db container
+
+`docker exec -it traccar-db mysql -uroot -pROOTPASSWORD`
+
+connect to database
+
+`use traccar-db`
+
+load the data
+
+```
+LOAD DATA LOCAL INFILE 'inn.csv' INTO TABLE tc_positions FIELDS TERMINATED BY ',' (@osmand,@deviceid,@Time,@Latitude,@Longitude,@valid) set protocol=@osmand,deviceid=@deviceid,devicetime=@Time,fixtime=@Time,servertime=@Time,latitude=@Latitude,longitude=@Longitude,valid=@valid;
+```
diff --git a/apps/photos/libre-photos.md b/apps/photos/libre-photos.md
index 21dd8b6..c9c2d40 100644
--- a/apps/photos/libre-photos.md
+++ b/apps/photos/libre-photos.md
@@ -143,3 +143,30 @@ services:
container_name: librephotos-redis
restart: unless-stopped
```
+## Librephotos backup/restore
+
+Docker offers volumes so /data and /code/protected_media are safely mounted on host. Simply rsync backup of these dirs
+
+posstgres db backup
+
+Usefull to avoid a full scan
+
+`docker ps`
+
+Grab postgres container id e.g.40b12de38945
+
+Backup
+
+`docker exec -t your-db-container pg_dumpall -c -U your-db-user > dump_$(date +%Y-%m-%d_%H_%M_%S).sql`
+
+A file like dump_20-11-2022_00_55_26.sql is created
+
+Restore
+
+`cat your_dump.sql | docker exec -i your-db-container psql -U your-db-user -d your-db-name`
+
+*Note the -U dbuser (default is docker for librephotos)
+and the -d bdname (default librephotos for librephotos)
+
+Put that on a crontab
+And there you go you have periodic db snapshots