Season complete — all events have passed.
No events added yet.
Admin Dashboard
{{ loginError }}
Season complete — all events have passed.
No events added yet.
No teachers yet. Click "Add Teacher" to get started.
{{ editingTeacher.id ? 'Edit' : 'Add' }} Teacher
No board members yet. Click "Add Member" to get started.
{{ editingBoardMember.id ? 'Edit' : 'Add' }} Board Member
{{ events.length ? 'No upcoming events.' : 'No events yet.' }} Click "Add Event" to get started.
{{ editingEvent.id ? 'Edit' : 'Add' }} Event
{{ pageSearch ? 'No pages match your search.' : 'No pages yet. Click "Add Page" to get started.' }}
No sections yet
Add one below or use AI to build the page
Select a section to edit
Click any section on the left to open its editor here
Sets the focal point — controls which part of the image stays visible when cropped or resized.
Describe changes — AI will revise the existing sections. Or completely redescribe to regenerate everything. Describe what this page should contain and AI will generate all the sections for you.
New Page
Leave the description blank to start with an empty page, or describe it to have AI generate the initial sections.
No admin users configured.
{{ editingUser.id ? 'Edit' : 'Add' }} Admin User
The IPTA CMS exposes a REST API served via Firebase Cloud Functions. Use it to build a fully custom public website — fetch teachers, events, pages, and navigation without any CMS login. All data is JSON.
https://ipta-cms.web.app
application/json
GET endpoints are publicly accessible — no API key or login required. Use them freely from any public website. POST, PUT, and DELETE operations require a Firebase Auth ID token passed as Authorization: Bearer <token>.
The teacher directory. Each teacher record includes contact info, the geographic service areas they cover, and a photo URL. Use the area or zip query params to power a "Find a Teacher Near Me" feature.
| Field | Type | Description |
|---|---|---|
| id | string | Firestore document ID. Unique identifier for this teacher. |
| firstName | string | Teacher's first name. |
| lastName | string | Teacher's last name. |
| string | Contact email address. | |
| phone | string | Contact phone number. |
| website | string | Teacher's personal or studio website URL. Always includes https://. |
| photo | string | Firebase Storage download URL for their headshot. May be empty string if not uploaded. |
| areasServed | string[] | Array of geographic area names they serve (e.g. ["Carmel", "Fishers"]). |
| zipcodesServed | string[] | Array of zip code strings automatically derived from areasServed. Use this for zip-based lookups. |
| createdAt | string | ISO 8601 timestamp of when the record was created. |
| updatedAt | string | ISO 8601 timestamp of last update. |
Program events and workshops. Dates are stored as human-readable strings (e.g. "Friday, April 12, 2024") rather than timestamps, so display them as-is. Use ?upcoming=true to get events sorted with the most recently added first.
| Field | Type | Description |
|---|---|---|
| id | string | Firestore document ID. |
| title | string | Event title or name. |
| date | string | Human-readable date string, e.g. "Friday, April 12, 2024". Parse with new Date(event.date) for sorting. |
| time | string | Time range string, e.g. "10:00 AM – 11:30 AM". |
| location | string | Venue name and/or address. |
| presenter | string | Name of the presenter or performer. |
| description | string | Plain text description of the event. |
| bio | string | Presenter biography, plain text. |
| createdAt | string | ISO 8601 timestamp. |
CMS-managed pages. Each page has a slug (the URL path) and a sections array that defines the full content of the page. Your public site should fetch a page by slug, then render each section in order based on its type.
/api/pages?slug=about returns an array — take the first element. To build a site router, fetch all pages on load, index them by slug, then look up the current URL path to find the matching page.
| Field | Type | Description |
|---|---|---|
| id | string | Firestore document ID. |
| title | string | Page title, for use in <title> tags and headings. |
| slug | string | URL-safe identifier. Match against the current URL path to load the right page (e.g. "about", "membership"). |
| sections | Section[] | Ordered array of content sections. Render these in order. See section types below. |
| updatedAt | string | ISO 8601 timestamp — useful for cache invalidation. |
| Field | Type | Description |
|---|---|---|
| id | string | Unique section ID within the page. |
| type | string | Section type — determines which renderer to use. See types below. |
| order | number | 1-based render order. Sections are already sorted in the API response. |
| bgStyle | string | Background color hint: "" = white, "grey" = light warm grey (#f0eeea), "blue" = brand blue (#5cc0ed), "dark" = dark navy (#1a1a2e). Apply to the section's outer wrapper. |
| content | object | Section-specific content fields. Shape depends on type. See below. |
Returns the global site configuration, including the navigation structure. Use this to build your site's nav menu — it tells you which pages are "featured" (in the primary nav), in what order, and what their URL slugs are.
nav array)| Field | Type | Description |
|---|---|---|
| pageId | string | The page's Firestore ID. Use to cross-reference with the /api/pages response. |
| slug | string | URL slug for this nav item — use as the link href (e.g. /about). |
| featured | boolean | If true, this page appears in the primary navigation. If false, it's a secondary/footer page. |
| navOrder | number | Sort order for the nav. Sort ascending by this field to render the menu in the correct sequence. |
IPTA board member directory. Use to build an "About / Leadership" page section.
| Field | Type | Description |
|---|---|---|
| id | string | Firestore document ID. |
| name | string | Full name. |
| title | string | Board title or role (e.g. "President", "Treasurer"). |
| bio | string | Short biography, plain text. |
| photo | string | Firebase Storage URL for their headshot. May be empty. |
No library or authentication needed for read operations. Here's a minimal example of loading a page by slug and rendering its sections: