Macaroni KID

A national network of local newsletters and event guides for parents and families — and the engineering systems that publish, search, and deliver that content.

What this knowledgebase is
A current, living reference for the Macaroni KID platform, rebuilt from a direct review of the four macaroni-kid-2.* source repositories. It replaces the older Google Doc / GitBook documentation (last meaningfully updated 2021–2025), correcting parts that had drifted from the live system. Use the left nav to drill into each component; the Gaps & Open Questions page tracks what still needs confirmation.

What the system does

Macaroni KID runs hundreds of localized "town" editions, each a community newsletter and event calendar maintained by a local publisher. The platform handles the full content lifecycle:

The four repositories

Public Website

macaroni-kid-2.web2

The public-facing site. PHP 7.4 on Apache, server-rendered, built with Gulp/Sass. Serves every town subdomain and tracks pageviews back to the API.

Explore the website →

REST API

macaroni-kid-2.api

The core backend. Node.js 18 + Express + Mongoose over MongoDB, with JWT auth, OpenSearch indexing, and a separate worker process for cron jobs and queues.

Explore the API →

Admin Panel

macaroni-kid-2.admin-panel

The internal management UI. An AngularJS 1.5 single-page app (Angular Material), built with Gulp/Bower and served as a container behind nginx.

Explore the admin panel →

Orchestration

macaroni-kid-2.docker-compose

Docker Compose definitions that wire the API, admin, web, and a local MongoDB together for development and reference production builds.

Explore environments →

By the numbers

4
Repositories
32
API controllers
40
Mongoose models
39
API route files
13
Scheduled cron jobs
3
OpenSearch domains

Technology stack at a glance

LayerTechnologyNotes
Public websitePHP 7.4, ApacheServer-rendered; Gulp + Sass build; git-deploy.php webhook deploy
APINode.js 18.20.7, Express, Mongoosev1.5.8; JWT/passport auth; PM2 cluster (4 instances); Sentry
WorkerNode.js (same repo)Separate process; node-cron jobs + queues; Dockerfile.worker
Admin panelAngularJS 1.5, Angular Material 1.1.4Gulp 3 + Bower build on Node 8; hosted on Heroku (branch CI/CD)
DatabaseMongoDB 3.4Accessed through Mongoose; primary system of record
Cache / queuesRedis (ioredis)Caching and background job queues
SearchAWS OpenSearchThree domains: Article, Business, Event
Object storageAmazon S3Image and asset uploads
EmailSendGrid, AWS SES, OngageTransactional + marketing; Fresh Address for validation
HostingLinodeAPI/web on Linode; CloudFlare in front; admin containerized
What changed since the old documentation
The core stack has grown: a dedicated API worker process (now on Coolify), a 3-node MongoDB replica set, Redis, three OpenSearch domains, and a broader set of email/integration providers. The admin panel remains on Heroku (branch-based CI/CD). The self-hosted Matomo analytics server (analytics.macaronikid.com) is being decommissioned.

Key contacts

NameRolePhoneEmail
Bien ConcepcionCTO202-550-0796bien@certifikid.com
Kim HumphreyCOO703-967-2993kim@certifikid.com

For CloudFlare / DNS changes and 2FA access, contact bien@macaronikid.com.