diff --git a/app/app.py b/app/app.py index 23affd4..1fbf8e7 100644 --- a/app/app.py +++ b/app/app.py @@ -31,7 +31,30 @@ NTFY_BASE = os.environ.get("NTFY_BASE", "").rstrip("/") NTFY_TOPIC = os.environ.get("NTFY_TOPIC", "scouting") NTFY_TOKEN = os.environ.get("NTFY_TOKEN", "").strip() SHEET_HEADERS = ["Timestamp", "Parent Name", "Email", "Phone", - "Children (name + fall grade)", "Interested In", "How They Heard", "Comments"] + "Children (name + current grade)", "Interested In", "How They Heard", "Comments"] + +# --------------------------------------------------------------------------- +# The seasonal surface. +# +# These are the only strings on the site that go stale on a schedule rather +# than when something actually changes. They live here so a meeting time move +# is one edit instead of twelve, and so the next person can see the whole +# seasonal surface at a glance rather than grepping for it. +# +# This is NOT a CMS and must not grow into one. Anything with a date in it +# belongs in the calendar feed, not here - a recruitment banner should read +# the next join night and render nothing when there is not one. Anything +# else is evergreen copy and belongs inline where git log can answer what +# the site said during recruitment. +# --------------------------------------------------------------------------- +PROGRAM_YEAR = "2026-2027" +MEETING_DAY = "Tuesday" +MEETING_DAYS = "Tuesdays" +MEETING_DAY_ABBR = "Tue" +PACK_TIME = "6:00 PM" +TROOP_TIME = "7:30 PM" +PACK_CLOCK = "6:00" +TROOP_CLOCK = "7:30" app = FastAPI(title="Pack & Troop 73") app.mount("/static", StaticFiles(directory="/app/static"), name="static") @@ -382,11 +405,11 @@ def page(title, body, active=""): {title} - + - + @@ -410,9 +433,9 @@ def page(title, body, active=""): @@ -432,9 +455,9 @@ def home(): body = f""" {hero('autumn-hike.jpg', 'center', 'Family Scouting · Zieglerville, PA', 'Where kids find their trail.', 'A Cub Scout pack and a Scout troop for kindergarten through age 17. Camp, build, lead, and grow alongside friends, right here in the Perkiomen Valley.', - '
Join us this fallSee the year
', 640)} + '
Join usSee the year
', 640)}
-
Meetings
Tue · Pack 6:00 · Troop 7:30
+
Meetings
{MEETING_DAY_ABBR} · Pack {PACK_CLOCK} · Troop {TROOP_CLOCK}
Where
St. Luke's Lutheran Church
Ages
Kindergarten to 17
Everyone
Every kid welcome · first visit free
@@ -457,11 +480,11 @@ def home():
Coming up at 73

Next up at 73.

{ev_html}
This list updates itself from the shared 73 calendar.
-See the full 2026-2027 calendar →
+See the full {PROGRAM_YEAR} calendar →
New here?

Your first visit, step by step.

01
Say hello
Send the interest form and a real leader (a local parent, not a call center) replies within a day or two.
-
02
Drop in on a Tuesday
Come watch a meeting, no commitment and nothing to bring. Kids usually join the fun within ten minutes.
+
02
Drop in on a {MEETING_DAY}
Come watch a meeting, no commitment and nothing to bring. Kids usually join the fun within ten minutes.
03
Take it at your pace
Register when your family is ready. We help with uniforms, costs, and every question in between.
Start with the form →
@@ -494,7 +517,7 @@ def cubs(): 'Cub Scouts is where it starts: derby cars, first hikes, campfire songs, and a den of friends who cheer each other on.')}
How it works

A den for every grade, a pack for every family.

-

Scouts meet in small grade-level dens, and the whole pack comes together for the big stuff: derbies, campouts, and award nights. Meetings are Tuesdays at 6:00 PM at St. Luke's, so siblings in different dens land on the same night.

+

Scouts meet in small grade-level dens, and the whole pack comes together for the big stuff: derbies, campouts, and award nights. Meetings are {MEETING_DAYS} at {PACK_TIME} at St. Luke's, so siblings in different dens land on the same night.

A parent or guardian stays for every Cub Scout meeting and event; it is a do-it-together program. Lions and Tigers work hands-on with their grown-up, while older dens mostly need you in the room (and extra hands are always put to work).

A Lion Cub Scout working on a craft
@@ -525,14 +548,14 @@ def cubs():
Keeping it affordable

The famous chocolate booth.

-

You will find us selling chocolate bars at the Green Lane Farmers Market on Saturday mornings. Fundraisers like the booth keep dues low and help every scout get to camp. Cost should never keep a kid out of Scouting; if it is a stretch, talk to us.

+

You will find us selling chocolate bars at the Green Lane Farmers Market on Saturday mornings in season. Fundraisers like the booth keep dues low and help every scout get to camp. Cost should never keep a kid out of Scouting; if it is a stretch, talk to us.

-
TuesdaysDen and pack meetings, 6:00 PM at St. Luke's
+
{MEETING_DAYS}Den and pack meetings, {PACK_TIME} at St. Luke's
MonthlyWeekend pack hike, usually 1:00 PM
-
SaturdaysChocolate booth at the Green Lane Farmers Market, 7:00 AM
+
SaturdaysChocolate booth at the Green Lane Farmers Market, 7:00 AM in season
-

Come try a Tuesday.

+

Come try a {MEETING_DAY}.

Your first visit is free and easy: just show up and see if it clicks. Most kids know by the end of the night.

Tell us you're coming
""" return page("Cub Scouts · Pack 73 · Zieglerville, PA", body, "cubs") @@ -547,7 +570,7 @@ def troop():
How it works

The scouts run it. Really.

Troop 73 is organized into patrols that elect their leaders, plan the trips, cook the meals, and fix their own mistakes. Trained, background-checked adults coach from the back row.

-

We meet Tuesdays at 7:30 PM at St. Luke's, right after the pack, so scouting families land on one night. Every kid ages 11 to 17 is welcome, with or without a Cub Scout past. (Officially we charter as a Scouts BSA troop. Around here, it's just the troop.)

+

We meet {MEETING_DAYS} at {TROOP_TIME} at St. Luke's, right after the pack, so scouting families land on one night. Every kid ages 11 to 17 is welcome, with or without a Cub Scout past. (Officially we charter as a Scouts BSA troop. Around here, it's just the troop.)

Founded in spring 2026 at St. Luke's, the troop is built by the scouts in it; the traditions are theirs to invent.

Scouts around the campfire circle at dusk
@@ -579,7 +602,7 @@ def troop():
The rhythm

One night a week, one adventure a month.

-
TuesdaysTroop meeting, 7:30 PM at St. Luke's, right after the pack
+
{MEETING_DAYS}Troop meeting, {TROOP_TIME} at St. Luke's, right after the pack
Most monthsA weekend campout, trip, or service project
All yearMerit badges and rank work at each scout's own pace
@@ -590,8 +613,8 @@ def troop():

No experience needed. Curiosity helps.

Plenty of great scouts never spent a day in Cub Scouts. If your kid is 11 to 17 and likes the idea of a weekend outdoors, they belong here.

-

Come watch a Tuesday.

-

The troop takes over at 7:30 PM at St. Luke's. Drop in, meet the patrols, stay if it clicks.

+

Come watch a {MEETING_DAY}.

+

The troop takes over at {TROOP_TIME} at St. Luke's. Drop in, meet the patrols, stay if it clicks.

Message the troop
""" return page("The Troop · Troop 73 · Zieglerville, PA", body, "troop") @@ -621,13 +644,13 @@ def calendar(unit: str = "all"): body = f"""
Pack & Troop 73 program year
-

The 2026-2027 year, at a glance.

-

The highlights below are open to visiting families. Come to any of them, or just show up on a Tuesday.

+

The {PROGRAM_YEAR} year, at a glance.

+

The highlights below are open to visiting families. Come to any of them, or just show up on a {MEETING_DAY}.

-
Pack Tuesdays · 6:00 PM
Pack or den meetings at St. Luke's Lutheran Church (off on school holidays)
-
Troop Tuesdays · 7:30 PM
Troop 73 meets right after the pack, same building
+
Pack {MEETING_DAYS} · {PACK_TIME}
Pack or den meetings at St. Luke's Lutheran Church (off on school holidays)
+
Troop {MEETING_DAYS} · {TROOP_TIME}
Troop 73 meets right after the pack, same building
About monthly · weekends
Pack hikes at rotating trailheads, usually 1:00 PM
-
Saturdays · 7:00 AM
Chocolate booth at the Green Lane Farmers Market
+
Saturdays in season · 7:00 AM
Chocolate booth at the Green Lane Farmers Market
@@ -645,7 +668,7 @@ def calendar(unit: str = "all"):
Dates occasionally shift. Registered families get the live TeamSnap calendar with every den and troop meeting; the newest info always wins there.
""" - return page("2026-2027 Calendar · Pack & Troop 73", body, "cal") + return page(f"{PROGRAM_YEAR} Calendar · Pack & Troop 73", body, "cal") # --------------------------------------------------------------------------- # Documents. Files come from the manifest in /docs (see documents.py); they are @@ -684,7 +707,7 @@ def documents_index():
{inner}
-Can't find something, or need a form in another format? Message us on Facebook or catch a leader on a Tuesday night. +Can't find something, or need a form in another format? Message us on Facebook or catch a leader on a {MEETING_DAY} night.
""" return page("Forms & Documents · Pack & Troop 73", body, "docs") @@ -711,7 +734,7 @@ FAQ = [ ("What does it cost?", "Annual registration plus modest pack or troop dues. Fundraisers like our chocolate booth keep costs down, and quiet help is available. Cost never keeps a kid out of Pack 73; just talk to us."), ("Do parents stay at meetings?", "Yes: a parent or guardian stays at every Cub Scout meeting and event. Lions and Tigers pair up with their grown-up for the hands-on parts; for older dens, being in the room is enough. Troop scouts (11 to 17) can be dropped off."), ("Which program fits my kid?", "K through 5th grade join Pack 73's dens. Ages 11 to 17 join Troop 73. Fifth graders get the best of both: Arrow of Light now, crossover to the troop in spring."), - ("Can we join mid-year?", "Any Tuesday works. Badges and adventures meet kids where they are, so a January start is just as good as a September one."), + ("Can we join mid-year?", f"Any {MEETING_DAY} works. Badges and adventures meet kids where they are, so a January start is just as good as a September one."), ("What about uniforms and gear?", "Start with sneakers and a water bottle. Uniform pieces come gradually, and we keep a stash of hand-me-downs. Nobody needs camping gear to start."), ("Who can join?", "Every kid. Pack 73 and Troop 73 are open to all children and teens, whatever their background or beliefs. If your kid wants to camp, build, and belong, there's a spot for them."), ] @@ -721,16 +744,16 @@ SOURCE_JS = """""" def thanks_body(): - return """ + return f"""
Thanks! Your note is on its way. A leader will be in touch soon.
Join Pack & Troop 73

We got it. Here is what happens next.

-

No commitment, and your first visit is always free. There is nothing to do between now and Tuesday.

+

No commitment, and your first visit is always free. There is nothing else you need to do - we will be in touch with the next meeting date.

1Your form is in. It went straight to our volunteer leaders' phones.
2Hear back within a day or two from a real Pack or Troop 73 parent, with the right den or troop and directions.
-
3Visit a Tuesday at St. Luke's: Pack 6:00, Troop 7:30. Sneakers and a water bottle are all you need.
+
3Visit a {MEETING_DAY} at St. Luke's: Pack {PACK_CLOCK}, Troop {TROOP_CLOCK}. Sneakers and a water bottle are all you need.
If a couple of days go by with nothing, check your spam folder, then send the form again. We would rather hear twice than miss you.
@@ -754,7 +777,7 @@ def join_body(error=""):
1Send the form. It goes straight to our volunteer leaders' phones.
2Hear back within a day or two from a real Pack or Troop 73 parent.
-
3Visit a Tuesday at St. Luke's: Pack 6:00, Troop 7:30. Sneakers recommended.
+
3Visit a {MEETING_DAY} at St. Luke's: Pack {PACK_CLOCK}, Troop {TROOP_CLOCK}. Sneakers recommended.
Scouts cheering during a pack game
@@ -769,7 +792,7 @@ def join_body(error=""):
-
List all kids you're considering. Any grade K-12 welcome.
+
List all kids you're considering. Any grade K-12 welcome.