Python 3.13 Flask + Gunicorn Guesty API Supabase PostgreSQL Render.com Reachy Mini

HOA rental forms,
fully automated.

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.

System architecture
Event-driven pipeline on the cloud
# 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
Pipeline

Two triggers, one automated pipeline

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.

Render Cron Job — every 2 days

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.

Render Cron automation toggle DB deduplication
Reachy Mini
Reachy Mini — voice commands

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.

Reachy Mini SDK OpenAI LLM routing X-API-Key auth

Then the pipeline runs →

01
Poll Guesty for ready guests

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.

OAuth2 Guesty v1 API token cache
02
Fill the PDF form

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.

PyPDF2 ReportLab Pillow
03
Email, mark, & log

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.

Gmail SMTP STARTTLS psycopg2
Dashboard

Everything in one place

Manage submissions, track history, send reminders, calibrate the PDF, and toggle automation — all from a Flask-served web UI.

Cloud cron — Render Cron Job service

Scheduled at 0 9 */2 * *. Reads the automation toggle from Supabase before running so it can be paused without a redeploy.

Supabase PostgreSQL — submission history

Every submission logged with guest name, dates, PDF filename, recipient email, and timestamp. Full audit trail with downloadable PDFs from the history panel.

Guest reminders via Guesty messaging

POSTs to Guesty's /conversations/{id}/send-message API to message guests on the Airbnb channel when check-in is within 5 days.

Live PDF field calibration UI

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.

Stack

Built with

All open-source, all production-grade. Hosted entirely on free/low-cost tiers.

Backend
Python3.13
Flask3.x
Gunicorn1 worker, 4 threads
psycopg2PostgreSQL driver
PDF & Email
PyPDF2template read
ReportLabtext overlay
Pillowimage processing
Gmail SMTPSTARTTLS / app pw
Infrastructure
Render.comweb + cron
SupabasePostgreSQL DB
Guesty APIOAuth2 / v1
Reachy Minivoice tools
Reachy Mini · Mochi

Voice-controlled from a robot

Custom Python tool classes installed on a Reachy Mini robot (Mochi) let you trigger and monitor the pipeline hands-free.

Submissions
Send the rental applications Submit HOA forms
Reservations
What are my upcoming reservations? Who's checking in soon? Give me the full guest list
Automation & status
Turn off automation Resume submissions Is the app online?
Implementation: Each voice command maps to a Python tool class (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.
🤖
Mochi
Online
You
Hey Mochi, send the rental applications
Mochi
I've started submitting rental applications for 2 guests. You can check the status in the Concierge dashboard.
You
What are my upcoming reservations?
Mochi
You have 3 upcoming reservations in the next 7 days. 2 guests have filled their check-in form. 1 still needs to.
You
Turn off automation for now
Mochi
Done. Automation is now off — the scheduled check will be skipped until you turn it back on.

Sign in to the dashboard

View reservations, submit forms, manage HOA automation, and review history.

Open Dashboard