The Tech Stack Powering Our CS Education Nonprofit
The software-for-nonprofits industry is far from a billion-dollar market, so most of what’s out there is pretty outdated and bad. Most nonprofits make up for it with lots of manual work.
I have a background in technology as the former founder of a Y Combinator backed startup, so when I started working at CodeDay, one of my priorities was to build software to automate as much work as possible.
This post is an overview of our current technology stack, which we used to bring our CS education programs to 13,000 students in-person and online last year.
It makes heavy use of microservices, which makes it easy for volunteers to contribute vs a monolith. We have more than 50 running right now, most of which we have created in-house.
Services We Created
- account: Web portal for Auth0 account management (things like setting your display name, pronoun, and agreeing to the TOS).
- auth0-google: Automatically provisions GSuite accounts for volunteers.
- blog: The website you’re reading this on!
- calendar-gql: GraphQL interface to consuming multiple ICS feeds; allows filtering and sorting, and automatically handles recurring events.
- clear: Event management system and data clearing house. Our more powerful, in-house version of Eventbrite which is heavily customized for our needs.
- cognito-sendy: Subscribes people who fill out a CognitoForm to a Sendy list.
- discord-authbot and discord0: Allows people to link their Discord accounts to Auth0 and synchronizes their roles, display-names, badges, etc.
- discord-codecup-helper: Posts scoreboard updates from CodeCup and the Big Data Challenge.
- discord-image-switcher: Generates a random server icon and server banner for our Discord, using our press photo library (over GraphQL).
- discord-johnpeter: CodeDay’s version of Hubot.
- discord-moderation: Custom Discord bot for logging and moderation of text and image posts.
- discord-posts: Collects Discord image/video posts from a channel, mirrors their content, and makes them available over GraphQL.
- elastic-match and labs-match-portal: API and frontend for matchmaking recommendations for CodeDay Labs students.
- engagement: Tracks which students/groups are active in our Discord during events, so we know who to follow up with.
- errors: Static error pages which Traefik defaults to when a service goes down.
- gql-server: Schema stitching between all our GraphQL services, built on Apollo.
- jobs: Portal listing job opportunities and alums willing to make internal referrals for our community.
- nomad-watcher: Posts Discord updates when the status of a job changes in Nomad.
- posters: Automatically generate customized PDFs and PNGs to promote events from a number of pre-built templates.
- present: Automatically generate customized kickoff presentations and live walls (schedule, social media posts, music) for events.
- quick-deploy: Manages the deployed versions of Docker jobs on Nomad without manually re-writing the job file.
- redirect: A small Docker container for redirecting multiple domains in one container.
- showcase-gql: Team management over GraphQL.
- si-images: Small service which connects Auth0 profile pictures to Small Improvements.
- topo: Our React-based design system.
- uploads: Internal API for uploading photos, videos, files, etc. which handles the communication with Mux and our image resizing URLs.
- www-corp: www.codeday.org site
- www-event: event.codeday.org site (for in-person CodeDays)
- www-labs: labs.codeday.org site
- www-virtual: virtual.codeday.org site
Other Open-Source Tools We Use:
- Puppet: Server provisioning.
- Docker: Containers.
- Nomad: Orchestration.
- Consul: Service registry.
- Vault: Secret management.
- Traefik: Load balancing proxy.
- MariaDB, Postgres, Redis, and Elastic: Databases.
- CTFd and rCTF: Customized versions for CodeCup and the Big Data Challenge.
- Consul-Alerts: Alerting when Nomad jobs fail.
- Logspout: Copying Nomad job logs into Splunk and Papertrail.
- Grafana: Program status dashboards.
- YOURLS: Link shortening.
- Statsd: Job stats aggregation.
- Sendy: Email list management.
- Splunk: Onsite log management and reporting.
- WordPress and WPGraphQL: Backend for this blog.
- Next.js and React: Almost all our websites are powered by Next.js at this point.
- Auth0: Account management.
- Contentful: CMS (sponsored nonprofit plan).
- NewRelic: Performance monitoring (sponsored nonprofit plan).
- PagerDuty: Alerting (sponsored nonprofit plan).
- Postmark: Email delivery.
- Twilio: SMS and phone delivery.
- Stripe: Payment processing.
- Chatra: Website live-chat.
- Cognito Forms: Forms — a lot more flexible than Google Forms, and we can seamlessly embed it with custom CSS.
- Papertrail: Offsite log backup.
- Datadog: Hardware stats.
- Tailscale: VPN.
- ClickSend: Automatic printing and shipping of posters to teachers.
- ShipBob: Warehousing and fulfillment of merch and event supplies.
- Fathom: Privacy-conscious website stats.
- Discord: Our community chat platform — we’ve tried Slack and Mattermost in the past, but most students already have a Discord which makes for more participation.
- Azure: Most of our jobs run on Azure VMs.
- Green House Data: Some jobs needing less network bandwidth are run on an owned server in donated colocation space from Green House Data.
- Fastly: Globally distributed caching (sponsored nonprofit plan).
- NS1: DNS — we use this over a free provider like Cloudflare because our DNS lookups were taking longer than connecting and transferring data.
- Imgix: Image compression on-the-fly.
- Mux: Video transcoding.