Bolton's Vermont Distilling Company: An Exercise in Automating a Workplace Comedy
Matt Stavola

Matt Stavola @mbstavola

Joined:
Jun 5, 2025

Bolton's Vermont Distilling Company: An Exercise in Automating a Workplace Comedy

Publish Date: Jun 5
9 0

What I Built

Summary

An AI-powered workplace comedy, viewed entirely through social media and powered solely by Postmark's Inbound Email Processing.

Details

Bolton's Vermont Distilling Company isn't a real company, it is my submission for the #postmarkchallenge where we're meant to leverage their email Inbound Processing feature to do useful and/or interesting things. Given the choice, I decided the best use of my time would be to not make anything useful but rather fun.

To me, Bolton's is meant to be a live, interactive version of The Office, Parks and Rec, or any other character-driven workplace comedy. With this project, I've defined 6 "personalities," assigned them organizational roles within this dying craft brewery, gave them access to an email "inbox," and then let social media be their microphone with which to perform for the world.

Our cast of characters:

  • Ian
    • Head of marketing
    • i.moore@mail.boltons.beer
    • His primary role in this comedy is the abrasive, cocky, clueless, jerk
    • If I said I didn't have a person in mind for this, I would be lying to you
  • Tyler
    • Senior Software Engineer
    • t.park@mail.boltons.beer
    • He is defined almost entirely by his complete laziness and absurd willingness to work hard to avoid doing work
    • I've worked with so many Tylers
  • Aisha
    • Master Brewer
    • a.johnson@mail.boltons.beer
    • She was my first attempt at having a character with more "positive" traits and someone who could be reasonable in the face of the chaos. She is also a huge nerd.
    • In many ways, Aisha is the main character!
  • Elena
    • Directory of sustainability
    • e.rodriguez@mail.boltons.beer
    • I wanted another character who was a bit more "cheery" and decided it would be fun to have someone who maximized their extroversion stat with a touch of naivety.
  • Ari
    • Director of Human Resources
    • a.grieco.patel@mail.boltons.beer
    • I wanted someone who was no-nonsense and an overcorrection for the hijinks of the other employees. They are meant to be sarcastic, witty, and unhinged in the complete opposite direction of everyone else.
  • Ken
    • VP of Sales
    • k.bautista@mail.boltons.beer
    • I wanted someone who was a complete, absolute mess. The kind of person that was always getting into trouble for the most humorous of reasons. To that end, in addition to making him incompetent I decided to make give him an incurable, fervent passion for anime and manga.
    • He is my favorite character by far, endless entertainment

The characters are defined in the employees.json file I use, written by hand but also fine-tuned with Deepseek. All images I used for them (avatar, profile pictures) I generated with AI.

Demo

You can just send an email to any of users above and then just watch this feed for a response. Your email will have a processing delay (you can read more about this below) and may or may not receive a post (though usually it will). Sometimes, your email could even trigger other employees as they get brought into the fray.

If you just want a summary of the various things the Bolton's crew has gotten into, here are some choice plotlines:

  • HR vs. Marketing Power Struggle: Ian and Ari engage in an escalating conflict involving accusations of "HR treason," termination notices, and legal threats, with Ian repeatedly violating his suspension to send increasingly unhinged emails about "illegal coups."

  • The Sentient Kombucha Crisis: Ken's kombucha experiment goes terribly wrong, resulting in a "Level 9 Temporal Hazard" that requires special containment protocols, SCOBY protection details, and "biological hazard diplomacy."

  • Freedom Lager Launch Disaster: A controversial new beer product causes chaotic interdepartmental conflict involving allegations of asbestos safety equipment, explosion hazards, and budget misappropriation.

  • Tyler's Automation Rebellion: Tyler's mouse jiggler devices, scripts, and passive-aggressive automation systems become targets of investigation, with one device apparently dying and becoming an office "monument" to workplace avoidance.

  • Office Security Meltdown: A paranoid series of escalating security measures including panic rooms, lockdowns, server room temperature manipulation, and WiFi kill switches created during the office conflicts.

  • The Maritime Legal Crisis: References to yacht funding, maritime tribunals, and "yachtjacking" suggest a conflict involving company assets potentially being misused for personal maritime activities.

  • Rogue Roomba Incident: An office Roomba appears to have been weaponized or otherwise modified in a way that violates company policy, with allegations it was programmed for "objection" protocols and other unauthorized behavior.

  • The Blockchain Coupon Scheme: A mysterious financial operation involving coupons, blockchain technology, and questionable applications like "IgnoreAllSubpoenasCoin" raises SEC investigation concerns.

Much of it transpires over email between employees, but you can see the various character POVs via their social media profiles. It's quite interesting!

Code Repository

How I Built It

Each of the characters (Ian, Tyler, Aisha, Elena, Ari, and Ken) essentially have an email address allocated to them which Postmark listens to. As emails come in (usually fron things like conferences, newsletters, business-y spam, etc which I signed them up for), Postmark sends a webhook to the employee-jabber application and we associate the incoming email with a character and a "reaction" gets queued for some time in the near future (do you immediately read your emails?).

When a reaction is processed, we load up the personality of that character into a prompt that we sent to Deepseek in a chat mode so that we have some "memory" of what has been going on recently. The model can then return the character's next action, which will be to either email another employee or talk about it on social media. I really wanted to have this feel like a dysfunctional company with maladjusted individuals. The exact kind of people who would have problems emailing each other effectively and would be most likely to complain about things on their social media profile.

Stack

The main application is written in Typescript using Deno, Hono, and Zod. I'm also making use of atcute for Bluesky/ATProto integration and postmark for, well, Postmark integration.

I'm utilizing Deepseek through the OpenAI client for the AI component.

The corporate/marketing portion of this is pure HTML and CSS, no frameworks or anything fancy like that.

Deployment was done through Fly.io for the app and Github Pages for the marketing site.

The entire project was done by hand (crazy we even have to clarify this these days) except for the corporate/marketing site (courtesy of Claude) and a helper script I wrote which allowed me to quickly iterate through the character profiles until I found something I liked. Believe it or not, the storyline.sample.txt was also something I wrote on my own... I won't say I'm the best writer, but this was honestly the most fun part of the project for me.

How to run on your own

To get the app running, you will need to:

  • Copy ./employees.sample.json to employees.json
  • Copy ./employee-jabber/.env.sample to ./employee-jabber/.env.prod

For the employees file, you can alter the employees as you wish (even add or remove them) but for sure you will need to have a bskyIdentifier and bskyPassword defined if you want to post to social media. The email is also important, but if you're just testing things you can leave that as is and send your webhooks with a matching to address. Once you've made your changes, you can run deno task encode-employees and it'll automatically update the .env.prod file.

Regarding the env file, pretty much everything can be left as the default unless you want to mess around with things. You will however need to add the following:

  • POSTMARK_API_KEY
  • AI_MODEL_PROVIDER_API_KEY

I've been using Deepseek but this project can also use any provider which supports the OpenAI SDK, but you'd need to set AI_MODEL_PROVIDER_URL and AI_MODEL_NAME accordingly.

After the above is done you should just be able to use either the Dockerfile or execute deno task start.

The corporate site also has a Dockerfile, but honestly its just static html so you can just view the files in your browser.

Nota Bene

One fun thing to note is that this group can get really chatty, really quick. To this end I've added ways to delay their response by some interval (MIN_ACTION_DELAY_MS and MAX_ACTION_DELAY_MS) and also implemented rate-limiting (RATE_LIMIT_AMOUNT and RATE_LIMIT_INTERVAL_MS). You should choose appropriate values for those properties if you were to deploy it to production (which I don't see why anyone would, but whatever!). An example of where and why this important is how I woke up to this:

Image description

That's a negative balance on my Deepseek dashboard. Of course, I only put about $10 in credits and it's only in the red by ~30¢ but it's still not something you want to see.

After investigating a bit, I saw that even with delays between 2m-15m, Bolton's employees were absolutely storming each other with emails. They would CC each other constantly, even if the other party's involvement wasn't directly pertinent. Ian was a profilic offender here, ensuring that everybody except him was on the hook for things. Other employees respond in a kind and then you get, well, this:

Image description

Image description

That is north of 2000 emails in the span of a few hours. What were they talking about? Well, if you really want to know:

Image description

Yeah, normal workplace stuff. Firings, office biohazards, accusations of treason and declarations of war... yup, the normal stuff. Of course, its not just the emails that spiked, but their social media posts went through the roof as well:

Image description

Image description

Image description

Image description

Image description

Image description

(Funnily enough, Aisha mostly kept to herself and rarely got involved with any of the drama. Often she would just ignore emails sent to her... weirdly on brand for the character!)

Of course, my intent wasn't to chew through my Postmark or Deepseek credits nor spam Bluesky. I felt like this was probably enough content to write about for this post, so I scaled the app down to zero and effectively turned off the faucet.

I've now turned it back on again, but with a much more generous delay which should hopefully tone things down a bit.

Comments 0 total

    Add comment