A cloud-hosted Python service that monitors Guesty reservations, fills HOA rental application PDFs with guest data, and emails the completed forms to the association — automatically, on a schedule, with voice control via a Reachy Mini robot.
# Render Cron Job (0 9 */2 * *) run_scheduled_check.py └─ check automation_enabled (Supabase) └─ HOAWorkflow.check_and_process_forms() ├─ GuestyAPI → fetch ready reservations ├─ HOAPDFFiller → fill PDF template ├─ HOAEmailer → Gmail SMTP TLS └─ Supabase → record submission # Reachy Mini (GUESTY_API_KEY auth) Mochi → X-API-Key → Flask REST API /api/submit-all /api/upcoming /api/settings
The system runs on a cloud cron schedule with zero manual intervention — and can also be invoked by voice through a Reachy Mini robot. Both paths feed the same three-step pipeline.
A Render Cron service runs run_scheduled_check.py on schedule 0 9 */2 * * (9 AM every other day). Before processing, it reads the automation toggle from Supabase — if disabled, the run is skipped entirely without a redeploy. It then queries guesty_agent.submissions for already-processed reservation IDs, ensuring the same guest is never emailed to the HOA twice across runs.
A Reachy Mini robot named Mochi runs the Reachy Conversation App, which uses an OpenAI LLM to route spoken commands to the right Python tool class. Each tool inherits from core_tools.Tool and makes an authenticated HTTP request to the cloud API using an X-API-Key header. Saying "send the rental applications" triggers the same submission pipeline as the cron job — instantly, on demand.
Then the pipeline runs →
OAuth2-authenticated calls to the Guesty REST API surface reservations where the guest's check-in form is complete — mailing address and license plate present.
PyPDF2 reads the blank HOA template; ReportLab overlays guest data at calibrated x/y coordinates. Field positions are editable from the dashboard without code changes.
Sends the PDF via Gmail SMTP (TLS, app password), marks the reservation submitted in Guesty's API, and writes the record to guesty_agent.submissions in Supabase — preventing any re-submission on future cron runs.
Manage submissions, track history, send reminders, calibrate the PDF, and toggle automation — all from a Flask-served web UI.
Scheduled at 0 9 */2 * *. Reads the automation toggle from Supabase before running so it can be paused without a redeploy.
Every submission logged with guest name, dates, PDF filename, recipient email, and timestamp. Full audit trail with downloadable PDFs from the history panel.
POSTs to Guesty's /conversations/{id}/send-message API to message guests on the Airbnb channel when check-in is within 5 days.
Dashboard tool to adjust x/y coordinates for each form field in real time. Generates a grid-overlay preview PDF and a test-fill preview without submitting to the HOA.
All open-source, all production-grade. Hosted entirely on free/low-cost tiers.
Custom Python tool classes installed on a Reachy Mini robot (Mochi) let you trigger and monitor the pipeline hands-free.
reachy_mini_conversation_app.tools.core_tools.Tool)
that makes an authenticated HTTP request to this API using an
X-API-Key header. Reachy runs the Conversation App with an
OpenAI LLM routing voice input to the appropriate tool.
View reservations, submit forms, manage HOA automation, and review history.
Open Dashboard