Theo checking in attendees at the Flagship Conference, 2019

đź‘‹ Hey!

I’m Theo Bleier

I want to study

CS&E at

my projects

I view coding as the most powerful way to broadcast my ideas to the world, the way others write or make music. Making at MIT would help me take my projects to the next level—learning and building things with MIT’s maker community.

Hack Club Bank

Ruby on Rails, HTML/CSS, JavaScript, jQuery

High school students are locked out of the most powerful way to create change in society—access to the financial system. Hack Club Bank is a web app that uses fiscal sponsorship, a way of operating subsidiary nonprofit entities, to give a 501(c)(3) bank account to any student-run nonprofit or hackathon in the country.

I shipped dozens of features to Bank while working at Hack Club, but two of my favorites are support for sending checks and ACH transfers, and customizable donation pages for each nonprofit. I worked with Ruby on Rails, JavaScript/jQuery, HTML, and CSS to implement both features—I designed the systems, built the backends, then worked with our designer to implement the frontends.

During my time at Bank (early 2019 to summer 2020), nonprofits raised over $500,000 and transacted over $1,000,000 through Hack Club Bank.

Check & ACH sending

Previously, Bank users could only spend money via our provided debit cards. Our users wanted to pay traditional vendors via check and ACH. The system had to track complex, interlinked transactions—from the fiscal sponsorship account to our escrow account at one bank, and then from our escrow account at a different bank to the account the check would eventually be cashed from—and checks required a massive state machine between sent, void, pending void, and deposited. Using the Lob API and several Postgres tables linked together, I built out the system and collaborated with our designer on the frontend/UX.

The initial flowchart I drew in San Francisco

Donation pages

Bank users traditionally collected money by sending digital invoices to sponsors. Using the Stripe API, I built out embeddable donation forms for projects (similar to a GoFundMe page) to collect spontaneous online donations.

Incoming deposits

As a hackathon organizer, it’s frustrating to not know when (often delayed) sponsorship funds are arriving, since essential bills like venue and food require payment in advance. I built a widget on the Bank dashboard showing incoming deposits, along with a live calendar displaying the exact date of arrival.

Automatic G Suite accounts

Domain email addresses are essential for nonprofits, to establish legitimacy and keep everything organized. So G Suite is included free with Bank—but each new account had to be manually created by support staff, introducing multi-day delays. I replaced the system with automatic account provisioning, which I built into our Rails backend using Google’s intricate G Suite Ruby SDK.

EpicSpleef

Java, Spigot, Minecraft

This past February break, my friends and I were looking for a new game to play, having played the same ones throughout most of quarantine. So, I decided to build something new.

There’s a classic Minecraft minigame called Spleef: everyone gets a shovel and is standing on a platform that has nothing beneath it. You break the blocks below other players, and whoever is left standing wins. I decided to build this, but add another gameplay mechanic, powerups, that give you a special ability when you pick them up (like an enhanced jump, or a teleport).

Minecraft doesn’t built-in mechanics for mini games, so they have to be custom-built. I used Spigot (a Minecraft Server API), to implement all of the features. This included basic behavior (causing blocks to break instantly, scoring when someone falls off the platform), and complex behavior (like a throwable bomb projectile) that I needed to interface directly with the native Minecraft server code to implement.

The project was a success! My friends and I played it for the back half of February break (I built it during the first half) and had a ton of fun. There’s a clip of some gameplay taken the other day on the left.

Club Fair Attention Monopoly

Node.js, Express, Twilio, HTML/CSS, JavaScript, jQuery

Any new club’s first challenge is the high school club fair. Starting Westborough Hack Club, we needed something that both would establish ourselves as a worthy competitor to legacy clubs like Model UN or Debate, and that would attract as much attention as possible.

I had three things in mind—bright, flashy, and addictive.

I built a website with a phone number and simple message: text us a color, see what happens. We put the site on a TV at our fair table and tens of high schoolers crowded around, sending hundreds of messages. With each message, the background of the site changed to match whatever color it contained—as if by magic.

Twilio powered the phone integration, and I used Node.js with Express to receive data from Twilio. The site itself was built with HTML, CSS, and JavaScript.

We had huge crowds of freshmen throughout the fair, resulting in 100 people signing up for a club that no one had ever heard of before.

Zoomer Be Gone

Node.js, Puppeteer, Redis, Zoom Web SDK, HTML/CSS, JavaScript, Socket.io

When the pandemic hit, Hack Club turned to Zoom. Worried about Zoombombing on public calls, I was tasked with figuring out a solution.

I designed a system where, after signing up for a Zoom call with an email, students receive a Zoom link that adds a few unique characters onto the end of their username. Anyone with a marked username would immediately be admitted—removing the need for a human to moderate the waiting room, and stopping would-be Zoombombers from easily joining en masse.

To do this, I needed to join a Zoom call from a server.

After some digging, I found Zoom’s tucked-away JavaScript Web SDK, meant for enterprise customers. It has to be spun up in a fully-fledged browser though—you can’t just run the JavaScript server-side.

So, I devised a scheme to spin up the Web SDK in a headless browser (Puppeteer), and link each of the SDK functions to a WebSocket command, so that a control server could programmatically “instruct” the headless Zoom client. It detects whenever a new user joins, and then my app could tell it whether to admit that user based on whether their username had a pre-approved database entry.

Other projects

Built by Theo with Next.js and 👨‍💻. Hosted by Vercel.