Local-first outreach, human-approved

Learn the CRM by doing the workflows.

Pick schools, keep notes, find contacts, draft carefully, approve before sending, and keep score on what actually works.

What are you trying to do?

Tap a card to jump to that workflow. Each workflow has a mini checklist you can click through while learning.

Open the app like a local tool, not a cloud portal.

Double-click this

Launch SchoolReach.command

Then open this

http://127.0.0.1:8765/
Where the data lives

Your working database is local: data/schoolreach.sqlite. Backups go in the same data/ folder before bigger imports or cleanup work.

The everyday loop: pick, learn, note, draft, approve.

Use this when you want to sit down and make progress without rebuilding the plan in your head.

Find nearby non-CPS schools first.

School SetSet it to Outside CPS when you want that first prospecting pass.
Sort ByUse Travel time for the default practical route. Distance is also useful.
Highest GradeUse 6th or lower when you want to stay focused on elementary-age schools.
ColumnsHide anything you do not need today so the school list stays calm.
Grade cap note

Highest Grade filters by the school's highest grade. When a grade cap is active, schools with missing grade data are left out because SchoolReach cannot safely know whether they are above or below the cutoff.

Travel time and distance came from the imported data. Later, a Distance settings tab can recalculate them from a starting address with Google Maps.

Make the screen fit the task.

When the Schools screen feels too busy, collapse the pieces that are not helping right now. The goal is to see one school's real information with less scrolling and less noise.

MenuUse the button at the top of the left menu to shrink the rail to icons.
Focus DetailHide the middle school list so the selected school gets the wide part of the screen.
Show ListBring the school list back when you are ready to pick the next school.
ColumnsTurn off low-value table fields for the current work session.
Best rhythm

Browse with the list open. When a school looks worth attention, switch to Focus Detail and work from Contacts, My Notes, Notes & History, and drafts.

Notes are where the CRM starts feeling useful.

Open a school and use My Notes. Saved notes become dated history items under Notes & History.

A useful note sounds like this

Talked to office. PTO handles assemblies. Try September. Principal likes family nights.
Call resultsWho you reached, what they said, and what to do next.
Contact researchWho handles enrichment, PTO, assemblies, or after-school programs.
Future cluesWhen to follow up and why the school is or is not worth pursuing.
Long imported notes

FileMaker notes are cleaned up. Long ones use a Read full note expander so they do not take over the page.

Use ChatGPT for web research, then keep the import reviewable.

Why it stays manual

Web search can be slow and messy. This keeps the expensive, guessy part visible and human-approved instead of quietly filling the CRM with bad contact guesses.

Draft emails with help, but approve like a human.

Rule of the road

SchoolReach should help you move faster. It should not send mystery emails behind your back.

Email setup without the jargon.

The goal is simple: only school outreach email should appear in SchoolReach.

Where school replies should go

This is the reply address added to new Gmail drafts.

schoolreach@312magic.com
aaron+schools@312magic.com

Which Gmail messages SchoolReach may read

Blank means do not poll Gmail. Fill this only after replies are separated.

to:schoolreach@312magic.com
label:SchoolReach
If you prefer labels

Make a Gmail rule that labels school replies as SchoolReach, then set SchoolReach to read only label:SchoolReach.

Check replies after the filter is set.

The app should not be a second Gmail inbox. It should only bring in school outreach replies you asked it to watch.

Tracking is how the app gets smarter.

Imported outreach timeline

Cleaned FileMaker notes appear as timeline events: contact research, calls, first touches, replies, follow-ups, and other useful traces.

Booking signals require evidence

Contact research stays contact research. The app should only call something booked when the data contains strong booking language.

Mark what happened

Booked, ran, canceled, ghosted, student count, revenue, and notes are all part of learning what actually worked.

When you know the result, mark it.

This is the scorekeeping layer

Outcomes are how SchoolReach learns which timing, contacts, and school types lead to real bookings.

Import carefully: preview, map, sanity-check, commit.

Gov dataSchool information is the trusted base for this project.
FileMaker contactsPeople, roles, emails, phones, and notes.
FileMaker notesCleaned and reflected as timeline history.
Travel fieldsTravel distance and time distance came from import data.

Useful files, backups, and operating rules.

Local serverserver.py
Database shapeschoolreach/schema.sql
CRM behaviorschoolreach/services/crm.py
Mail behaviorschoolreach/services/mail_provider.py
App UIstatic/app.js and static/styles.css
Helpersscripts/ contains imports, cleanup, and setup helpers.

Backup examples

data/schoolreach.sqlite.before_filemaker_import_20260630
data/schoolreach.sqlite.before_related_filemaker_import_20260630
data/schoolreach.sqlite.before_note_cleanup_20260630

Good operating rules.

Keep SchoolReach local-first.
Do not send email without human approval.
Keep Gmail filtered to school outreach only.
Prefer dated notes over memory.
Hide columns you do not need today.
Mark outcomes when you know them.
Do not let contact research pretend to be a booking.

Pick the next school. See what you know. Write down what happened. Draft carefully. Approve before sending. Keep score.

Small batches. Clear history. No surprise sends.