
The React Bug That Google Translate Causes
A mysterious production crash you can't reproduce locally. The culprit? Google Translate modifying the DOM behind React'...
How I used Cursor to build a serverless Slack bot in just 2 hours of actual work - and why the hardest part wasn't the code, it was the corporate AWS discussions.
I had a problem that’s probably familiar to anyone managing remote team culture: I was becoming the default organizer for our neighborhood lunch meetups. Every time the weather looked good, I’d be the one checking forecasts, making judgment calls, and posting “anyone up for park lunch?” in our local Slack channel.
It worked, but it wasn’t sustainable. What happens when I’m on vacation? What about those perfect sunny Tuesdays when I’m heads-down in client work and forget to check the weather entirely?
So I did what any developer would do: I automated myself out of the coordination role. Using Cursor as my AI pair programming partner, I built a serverless weather bot that handles the boring logistics while preserving the human connections that actually matter.
The result? A system that required maybe 2 hours of my actual development time, handles weather checking automatically, and is about to go live in our production Slack workspace. Here’s how modern AI-assisted development made this almost trivially easy to build.
Our hyperlocal Slack channel for Munich consultants had developed a great rhythm around weather-dependent park lunches. When conditions were good, someone would post, and whoever could make it would show up with takeaway food for an hour of actual human interaction.
But I noticed a pattern: it was usually me initiating these meetups. And when I asked myself why, the answer was simple - I was the one who had gotten into the habit of checking weather and making the call about whether it was “good enough” to suggest.
The insight: What if we could automate the weather checking and posting, but keep all the human decision-making about whether to actually show up?
This isn’t about optimizing social interactions or building complex scheduling systems. It’s about removing the single point of failure (me) from something that was already working well.
Before diving into the technical solution, I had to work within our company’s Slack policies. Like many organizations handling client work, we have constraints around Slack integrations:
Initially, I wanted to build a full Slack app that could react to emoji responses on its messages. But honestly? I don’t want that burden, and the constraints led to a cleaner design anyway.
The compromise delivers about 90% of the intended functionality: the bot posts weather notifications via webhook, and includes a simple API link for confirmations. If the link accidentally leaks, the worst case is someone confirming a lunch meetup they didn’t attend - hardly a security catastrophe.
The lesson: Reasonable constraints often lead to better solutions than unlimited freedom.
This project was perfect for AI-assisted development. I had clear requirements, well-established patterns to follow, and a defined scope. With Cursor handling the implementation details, I could focus on the logic and user experience.
Project Structure and Boilerplate: I described wanting “a serverless TypeScript weather bot that posts to Slack when conditions are good for outdoor lunch” and Cursor immediately suggested the right architecture:
// Cursor generated this clean handler structure
export const weatherCheckHandler = async (event: WeatherCheckEvent) => {
const config = getConfig(event.overrides);
const weather = await weatherService.getCurrentWeather(config);
if (isGoodWeatherForLunch(weather, config)) {
await sendSlackNotification(weather, config);
await trackMessage(config.locationName, 'weather-reminder');
}
};
Infrastructure as Code: The OpenTofu (Terraform) configuration was particularly impressive. Cursor understood I needed:
Testing Setup: Comprehensive Vitest configuration with proper mocking patterns, including AWS SDK mocks and weather API stubs.
The Setup Script: This was the real game-changer. Cursor helped me build a setup script that handles:
The Terraform SSO Authentication Nightmare: This was my biggest technical hurdle, and it perfectly illustrates the gap between AI assistance and real-world enterprise constraints.
I was trying to deploy with a remote state backend (S3 + DynamoDB) using our company’s AWS SSO setup. Everything looked correct in the configuration, but Terraform kept failing with cryptic errors:
Initializing the backend...
╷
│ Error: error configuring S3 Backend: no valid credential sources for S3 Backend found.
│
│ Please see https://www.terraform.io/docs/language/settings/backends/s3.html
│ for more information about providing credentials.
│
│ Error: SSOProviderInvalidToken: the SSO session has expired or is invalid
│ caused by: open /Users/lucabecker/.aws/sso/cache/11e8fea37e9cbcd18f1c1a0ea6342622e23cfcc0.json: no such file or directory
Cursor kept trying to fix the Terraform configuration - suggesting different authentication methods, tweaking the backend configuration, adding explicit credential providers. But none of it worked with our SSO setup.
The Real Solution: Switch to OpenTofu entirely. The moment I replaced terraform with tofu in my commands, everything worked flawlessly with the exact same configuration files. No authentication changes, no credential tweaks - just a different binary.
This highlights something important about AI-assisted development: the AI can help you implement solutions, but it can’t always diagnose when the fundamental tool choice is wrong. Sometimes the problem isn’t your code - it’s the tool itself.
TypeScript Quality Issues: Cursor has clearly been trained on a lot of poor TypeScript code. It constantly wanted to use any types and add needless comments:
// Cursor's first attempt
const weatherData: any = await response.json(); // Get weather data from API
// After reprompting with rules
const weatherData: WeatherApiResponse = WeatherApiResponseSchema.parse(await response.json());
The Solution: Rule files. I created a simple rules file that specified:
any”After adding rules, the code quality improved dramatically. This is where treating AI like a “10x junior developer” really shows - you need to establish coding standards just like you would with a human team member.
Here’s the breakdown of actual development time:
Hour 1: Core weather checking logic, Slack webhook integration, and basic Lambda setup Hour 2: DynamoDB tracking, API Gateway configuration, and testing setup
Everything else was either:
The contrast is striking: the technical implementation was trivial with AI assistance, but the organizational coordination took weeks.
The final system elegantly works within our constraints while maximizing social impact:
EventBridge (10 AM weekdays) → Weather Check Lambda → Slack Webhook
↓
DynamoDB (message tracking)
↑
API Gateway (/reply) → Reply Lambda → (confirmations + preferences)
The bot checks conditions every weekday at 10 AM CEST - early enough for lunch planning, late enough for accurate forecasts:
const isGoodWeatherForLunch = (weather: WeatherData, config: Config) => {
return (
weather.temperature > config.minTemperature &&
config.goodWeatherConditions.includes(weather.condition) &&
!config.badWeatherConditions.includes(weather.condition)
);
};
When conditions are perfect, team members receive encouraging notifications that actively promote meetups, complete with reaction prompts and confirmation links:
Notice how the good weather notification actively asks “Anyone up for a lunch meetup in the park?” and provides clear next steps for coordination.
Maximum 2 weather notifications per week, tracked in DynamoDB. This isn’t a technical limitation - it’s a design choice that prevents automation fatigue while ensuring perfect weather days don’t get missed.
The bot can also notify team members about less-than-ideal conditions, but with a completely different tone - informational rather than promotional:
Notice the different messaging: instead of encouraging outdoor meetups, it acknowledges the poor conditions and suggests indoor alternatives. No reaction prompts or confirmation links - just helpful context for those who want to stay informed. These notifications can be opted out of if teams prefer to hear only about good weather days.
Since we can’t read Slack messages, the bot includes multiple ways for team members to indicate participation. The good weather notifications encourage both immediate Slack reactions (“React with ✅ to communicate with colleagues”) and post-meetup confirmation via a simple API endpoint.
This dual approach works around our corporate Slack constraints while still enabling coordination: team members can use native Slack reactions for real-time coordination, then optionally confirm attendance afterward via the API link to help track the bot’s effectiveness and prevent duplicate notifications that week.
The setup script makes deployment genuinely pleasant:
cd terraform
chmod +x setup-bot.sh
./setup-bot.sh
It handles everything automatically:
Multiple teams can deploy separate instances with different configurations, locations, and Slack channels. Each gets isolated resources and tracking.
This project reinforced something important: the best social technology gets people offline, not more online.
The bot doesn’t try to replace human interaction - it removes friction from interactions people already want to have. Instead of relying on one person to manually coordinate, the automation handles boring logistics so humans can focus on the social aspects.
Before: Someone (usually me) checks weather, decides if it’s good enough, posts hoping others see it After: Consistent weather notifications at optimal timing, objective criteria, reliable coordination
The goal isn’t to optimize social interactions with metrics - it’s to make good things happen more reliably. Sometimes members are busy and forget they might want to take a break and see their colleagues. This can help with that gentle reminder when conditions are perfect.
As more teams work remotely, we need better ways to facilitate real-world connections. The solution isn’t more video calls or digital team-building - it’s removing friction from the in-person interactions people actually want to have.
The pattern is replicable:
This is especially important when team members might be working from different locations or have flexible schedules. The bot creates predictable opportunities for spontaneous connection - people know to check Slack around 10 AM on nice days, making “spontaneous” lunch plans more likely to succeed.
The bot is currently running in a test Slack workspace and should go live in our production channel tomorrow (pending webhook URL approval from our workspace admin). After months of testing, the system has proven reliable and useful without being annoying.
The real test will be whether it successfully removes me from the coordination role while maintaining the lunch tradition’s success rate. I want these meetups to work even when I’m on vacation, and I want them to happen without anyone feeling like they need to be “the organizer.”
This project showed me what AI-assisted development looks like when it’s working well:
What AI handled brilliantly:
What still required human judgment:
The combination is powerful: AI handles the tedious implementation details while humans focus on the problems worth solving and the trade-offs worth making. I’m no expert with Terraform or Lambda, but with Cursor’s assistance, building serverless infrastructure felt like a breeze.
The entire project is open source with comprehensive documentation, setup scripts, and configuration examples. Whether you want to adapt it for your team’s coordination needs or just see how to build practical serverless applications with Cursor, everything’s available on GitHub: lunch-slack-bot.
Because the best social technology is the kind other people can actually use and modify for their own communities. Maybe your team needs a different kind of coordination bot, or maybe you want to adapt the weather logic for different activities. The infrastructure is designed to be flexible and reusable.
Have you used AI-assisted development to solve real human problems? I’d love to hear about projects where modern tooling made previously complex automation almost trivially easy to build - and especially about tools that bring people together in real life.
Explore more articles on similar topics

A mysterious production crash you can't reproduce locally. The culprit? Google Translate modifying the DOM behind React'...

A retrospective on six months of AI-assisted coding with Cursor - how Planning Mode became a brainstorming partner, why ...

How I went from thinking RAG required custom search APIs to building a functional knowledge base chatbot in one evening,...