# TODO ## App - [ ] Display `last_sale_date` attribute from `owners.rds` somewhere in the UI so users know how current the ownership data is ## Data - [ ] Verify SCPA Public.xlsx column structure is stable across downloads - [ ] Delete app from shinyapps.io (account: rob-wiederstein, appId: 14173710) - [x] Add cron job to run `update_owners.R` weekly inside the rstudio container: Runs every Sunday at 11pm via crontab; restarts standrews_shiny after; logs to ~/standrews_update.log Tested end-to-end 2026-03-09 — 388 owners written, options(timeout=300) required for 87.5 MB download - [x] Move cron log from ~/ to project dir (2026-04-16): Log now writes to /data/projects/r/stAndrews/logs/refresh.log logs/ added to .gitignore and .dockerignore ## Features - [x] Download owner names and addresses for mailing labels - Two buttons: Download Filtered, Download All (388) - Uses SCPA mailing address fields directly (same data used for tax bills) - [ ] Add RentCast active listings tab - Pull active listings via RentCast API (see veniceProp/sarco for prior work) - Spatially filter to St. Andrews subdivision boundaries (`data/plats/plats.shp`) - Display on map + table (similar to Owners tab) - Store API key as environment variable, not in code - Consider caching results (API has rate limits) ## Performance - [ ] Optimize CI build time: create a pre-built base image with R packages already installed so renv restore is skipped on redeploy. Cold builds currently take ~10 minutes due to geo stack (sf, gdal) compilation. ## Deployment - [x] Fix SSH deploy workflow — switched to self-hosted runner (runs-on: self-hosted), eliminates SSH roundtrip - [x] Create Dockerfile, docker-compose.yml, .gitea/workflows/deploy.yaml - [x] Push to Gitea — act_runner deploys on push to main - [x] App live at apps.robwiederstein.org/stAndrews/ Notes: - Gateway route is hardcoded in ~/docker/gateway/Caddyfile (import pattern failed) - Volume mounts: only ./data and ./www — app code baked into image to avoid renv conflict - act_runner registered at user level, not repo level