Skip to content

Caellwyn/guy-lunch

Repository files navigation

Tuesday Lunch Scheduler

Automation for a 25-member business networking group — Reduced weekly coordination time from 60+ minutes to under 5.

FeaturesArchitectureTech Stack


The Problem

A long-running Tuesday lunch group in Longview, WA had a coordination problem. Every week, the secretary:

  • Manually tracked host rotation on paper
  • Hand-typed 20+ email addresses into a group announcement
  • Printed the email and circled names to take attendance
  • Fielded calls from members asking "when's my turn to host?"
  • Chased down upcoming hosts to confirm restaurants

Total time: 60+ minutes per week, every week, for years.

The Solution

I built a web app that automates the entire workflow. The secretary's job is now two things: make the reservation, and tap names on a screen to take attendance.

Weekly automation:

  • Thursday: Email upcoming hosts asking for restaurant confirmation
  • Friday: Alert secretary to make the reservation
  • Monday: Send announcement to all members with location, map link, and host info
  • Tuesday: After lunch, request ratings from attendees

Result: 90% reduction in coordination time.


Features

For the Secretary

  • One-tap attendance: Check off members as they arrive
  • Drag-and-drop host ordering: Adjust the queue when schedules conflict
  • Cancellation handling: Cancel a week and all future assignments shift automatically
  • 3-host status view: See confirmation status for this week, next week, and two weeks out

For Members

  • Personal dashboard: See when you're hosting, who's up next, upcoming lunch details
  • "Batting order" lineup: Full hosting queue with estimated dates
  • One-click ratings: Rate restaurants directly from the post-lunch email
  • Attendance history: Track your own participation

For the Group

  • Location database: Saved restaurants with Google Maps links, phone numbers, and group ratings
  • Automated emails: Professional announcements without manual effort
  • PWA support: Install on phone home screens for quick access

The Baseball Thing

The group is mostly men over 60 who like sports. "Lineup" was a natural metaphor for hosting rotation, so I leaned into it: "At Bat" (hosting this week), "On Deck" (next week), "In the Hole" (two weeks out). It fits the culture.


Architecture

┌─────────────────────────────────────────────────────────────────┐
│                         Flask App                                │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────────┐  │
│  │ Routes      │  │ Services    │  │ Models                  │  │
│  │ • Admin     │  │ • Email     │  │ • Member                │  │
│  │ • Secretary │  │ • Places    │  │ • Location              │  │
│  │ • Member    │  │ • Scheduler │  │ • Lunch                 │  │
│  │ • API       │  │             │  │ • Attendance / Rating   │  │
│  └─────────────┘  └─────────────┘  └─────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘
         │                  │                      │
         │                  │                      │
    ┌────▼────┐      ┌──────▼──────┐       ┌──────▼──────┐
    │  Brevo  │      │Google Places│       │ PostgreSQL  │
    │ (Email) │      │    API      │       │  (Railway)  │
    └─────────┘      └─────────────┘       └─────────────┘

Key Design Decisions

Decision Rationale
Computed host queue Hosting order is calculated from last_hosted_date, not stored as a fixed list. No stale data, no manual reordering bugs.
Stack-based cancellations When a lunch is cancelled, all future host/location assignments shift forward automatically. Uncancel reverses it.
Magic link auth Target users are 60+ and not tech-savvy. No passwords to forget — just click the link in your email.
Role separation Secretary, Admin, and Member portals have different views and permissions. Secretary can't accidentally delete members.

Tech Stack

Layer Technology
Backend Python, Flask, SQLAlchemy
Database PostgreSQL (Railway)
Frontend Jinja2 templates, Tailwind CSS
Email Brevo (transactional API)
Maps Google Places API
Hosting Railway (auto-deploy from GitHub)

Database Schema

Member ◄──┬── hosts ──► Lunch ◄── at ──► Location
          │
          └── attends ──► Attendance ◄── for ──► Lunch
                                │
                          Rating ◄──┘

Lunch status values:

  • planned — Upcoming, not yet occurred
  • cancelled — Skipped (excluded from all date calculations)
  • completed — Occurred, attendance recorded

Automated Email Schedule

Day Time Email
Thursday 9am Host reminders (3-tier: At Bat, On Deck, In the Hole)
Friday 9am Secretary notification to make reservation
Monday 9am Group announcement with location and map
Tuesday 6pm Rating requests to attendees

What I Built

This project demonstrates:

  • Real-world problem solving: Built for actual users with actual pain points
  • Workflow automation: Replaced a 60-minute manual process with scheduled jobs
  • User-appropriate design: Magic links and baseball metaphors for a non-technical audience
  • Third-party integrations: Brevo for email, Google Places for location data
  • Role-based access control: Three distinct portals with appropriate permissions

License

MIT


Acknowledgments

Built for my dad's networking group. Built with Flask, Railway, Brevo, Google Places API, and Claude Code.

About

Guy lunch tracking and email automation service.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages