An open-source tool to track PE licenses, firm registrations, and continuing education requirements with reminders, automation, and intelligent client responses.
PE License Buddy helps engineering firms simplify compliance management by centralizing license and registration data, automating renewal reminders, and providing an API that can power dashboards or client responses.
- Load license data from a CSV file or Airtable.
- Query license status, expirations, and CEU progress through a lightweight REST API.
- Generate reminder payloads and draft email notifications or send OpenPhone messages.
- Extend or replace the data layer without changing higher-level services.
src/
├── api/ # HTTP server built on Node's standard library
├── data/ # Data providers (CSV or Airtable REST)
├── reminders/ # Scheduler utilities
├── services/ # Business logic for licenses and reminders
└── index.js # Application entry point
- Data providers normalize records to a common schema regardless of the source.
- Services compute expiration insights, CEU rollups, and reminder payloads.
- API exposes JSON endpoints (see
docs/API.md). - Reminder engine can deliver OpenPhone SMS messages directly and stores email drafts inside
outbox/for review.
- Clone the repository and copy the example environment file:
cp .env.example .env
- Update
.envwith your CSV path or Airtable credentials. The default configuration reads fromschemas/licenses.csv. - Install dependencies (the MVP uses the Node standard library;
npm installsimply prepares the lock file):npm install
- Start the API:
The service listens on
npm start
http://localhost:4000by default. - Run the test suite with Node's built-in runner:
npm test
Environment variables are documented in .env.example. Key options include:
DATA_SOURCE:csv(default) orairtable.CSV_PATH: Path to the CSV file.AIRTABLE_API_KEY,AIRTABLE_BASE_ID,AIRTABLE_TABLE,AIRTABLE_VIEW: Required for Airtable integration.OPENPHONE_API_KEY,OPENPHONE_FROM_NUMBER,OPENPHONE_TO_NUMBERS: Configure OpenPhone SMS delivery.EMAIL_RECIPIENTS: Comma-separated list used when generating email drafts.ENABLE_SCHEDULER: Set totrueto enable the built-in reminder scheduler.
Sample CSV data is provided in schemas/licenses.csv. Airtable users can mirror the structure defined in schemas/airtable.md.
Each license record includes:
firm_namelicense_numberstatestatusexpiration_dateceu_requiredceu_completed- Optional
holder_nameandverification_url
The reminder engine supports two channels:
- OpenPhone: Sends formatted SMS messages through the OpenPhone API.
- Email: Saves ready-to-send
.txtdrafts inoutbox/. You can connect this directory to an SMTP process or review manually.
Use the /reminders/preview and /reminders/dispatch endpoints to orchestrate reminders. Details are available in docs/API.md and the template snippets under templates/.
- Interactive dashboard (React/Next.js) using the REST API.
- Additional data adapters (SQL, Google Sheets).
- Automated CEU tracking workflows.
- Integration tests for data providers and scheduler.
We welcome contributions! See CONTRIBUTING.md for workflow and style guidance.
This project is licensed under the MIT License. See LICENSE for details.
Project Lead: Enrique Lairet, PE
Website: OasisEngineering.com
Support Email: info@oasisengineering.com