JavaScript, webdev

Building PowderCast: The Ultimate Open Source Weather App for Snowboarders 🏂

If you know me, you know I love two things: writing code that solves real problems, and shredding fresh powder.

For years, I’ve been frustrated with generic weather apps. You know the struggle – the app says “partly cloudy and 30°F” for the town near the resort, but when you get to the summit, it’s a whiteout with 50mph gusts and wind-hold on every lift.

The delta between “base village weather” and “summit weather” can be the difference between the best day of your season and a frostbitten disaster.

So, I did what any engineer would do:

I built my own solution: PowderCast.

Continue reading
Standard
bots, Business, JavaScript

Streamline Engineering Updates with Slack to Notion Bot

There’s been a lot of noise lately about productivity tools and the “perfect” engineering workflow.
Let’s slow down and separate what actually works from what just creates more overhead.

Here’s a boring truth: Slack is incredible for quick, ephemeral communication.
Here’s a less comfortable truth: It is an absolute nightmare as a system of record.

If you lead an engineering team or run a startup, you probably have a #daily-updates or #eod-reports channel.
The theory is sound.

Everyone drops a quick note at the end of the day: what they shipped, what blocked them, what’s next.

But here is what actually happens:

Those updates get posted.
Someone replies with an emoji.
A thread erupts about a weird bug in production.
Someone posts a picture of their dog.

By Friday, when you’re trying to answer a simple question—“What did we actually accomplish this week?”—those reports are buried under a mountain of noise.

You find yourself scrolling endlessly.
It’s exhausting.
And it doesn’t scale. Not to mention that if you will need SOC-2 (and you will 🙂 ) –> you can’t say “we have everything in Slack”

Why not just force everyone into Jira or Linear?

You could.
But engineers hate context-switching just to write a status update.
Slack is where the conversation is happening.
The friction to post there is zero.

The problem isn’t the input. The problem is the storage.

So I (=Gemini+Claude) built a bridge.

Meet the Slack → Notion EOD Sync Bot

I got tired of losing track of momentum, so I wrote a bot that does the tracking for us.

It’s a lightweight NodeJS service that automatically extracts End-of-Day reports from Slack and structures them beautifully in a Notion database.

Continue reading
Standard
Chrome, JavaScript, webdev

Building a Real-Time Pull-Up Tracker: How I Taught The Browser to Count Our Pain

It started as a simple idea my son brought up: Can we make a web app that counts our pull-ups during our pull-up games?

Turns out, teaching a machine to recognize human suffering is both hilarious and complicated.
What began as a “let’s make a quick pull-ups app” spiraled into an intense journey through computer vision, browser quirks, and a few accidental infinite loops that made our laptop sound like a jet engine.

The “Simple” Goal

I wanted to automatically count pull-ups using a web camera.

Easy, right?

Just detect a human, see when they go up and down, and count.

Continue reading
Standard
cloud, Design, JavaScript, webdev

Building Resilient Microservices for Bootstrapped Apps 🏃🏼‍♀️🚵🏼

Out on the trail, your phone isn’t plugged into a wall. Every network ping drains battery. Every background process steals CPU cycles that could keep your GPS running for another hour.

In my previous post on the GPX Water Mapper, we explored visualizing water sources along your route. Now we’re going under the hood: designing a microservices architecture that respects the constraints of outdoor apps—where a dead battery isn’t just inconvenient, it’s potentially dangerous.

Imagine getting a real-time hydration alert as you approach mile 12 of your desert bike ride, calculated from your current pace, the temperature, and known water sources ahead.
All while using less battery than a typical podcast app.

What we’ll build:

  • A microservices approach that actually makes sense for small teams
    (spoiler: not everything needs to be a service – moreover, in many cases you should avoid it and run on a monolith)
  • Event-driven patterns that keep your app responsive without constant polling
  • Node.js implementations you can deploy on minimal infrastructure
  • Real-world trade-offs: when to split services and when a monolith wins

Continue reading
Standard
Business, JavaScript, webdev

Craft Exceptional Web Experiences as a Full-Stack Engineer

At EspressoLabs.com, we’re on a mission to redefine the future of IT/Security management through exceptional user experiences and cutting-edge technology.
We believe that enterprise software should not only be powerful and scalable but also intuitive, elegant, and a joy to use.

We’re building a platform that merges AI-intelligence with seamless design—and we’re looking for a Full-Stack Developer who shares our passion for creating meaningful, impactful technology.


Continue reading
Standard
Chrome, JavaScript

Effortlessly Compare Strava Activities with This New Tool

If you’re a cyclist, runner, or triathlete, chances are you’ve spent more time than you’d like clicking back and forth between Strava tabs to figure out where you gained or lost time on a ride. I’ve been there — juggling two activity pages, scrolling, mentally matching segments, and trying to keep my eyes from glazing over.

That’s exactly why I built the Strava Segment Comparator Extension.

It’s a lightweight, privacy-friendly tool that runs entirely in your browser, lets you quickly compare any two Strava activities, and shows segment-by-segment differences in both time and speed. Whether you’re racing a friend, analyzing your improvement, or just curious how different routes stack up, this extension saves you time and keeps your focus where it matters — the data.

You can also see all the TL;DR here.

Continue reading
Standard
JavaScript, webdev

EspressoLabs Coding Challenge: Build a Real-Time Chat App

At EspressoLabs, we’re always on the lookout for talented engineers who can move fast, think clearly, and build scalable systems. Our home assignment is designed to evaluate just that — and we keep it focused and time-boxed.

“Talk is cheap. Show me the code.”
– Linus Torvalds

Continue reading
Standard
JavaScript, webdev

The Future of Coding: LLMs as Collaborators

The rise of large language models (LLMs) has been one of the most transformative developments in software engineering in decades. Tools like GPT4.1, Gemini 2.5 Pro, Claude Opus 4, and various AI-powered code editors such as Cursor (or CoPilot) promise to change the way we build software.

But as these tools evolve and mature, the real question isn’t if we should use LLMs—it’s how.

There’s an emerging split in philosophy between two approaches: full automation through AI agents and IDE integrations, or human-led development using LLMs as intelligent partners.

Based on real-world experiences and a critical review of LLM-based coding tools, the most effective path today is clear:

LLMs are best used as powerful amplifiers of developer productivity—not as autonomous builders.

Let’s break down why.

Continue reading
Standard
Chrome, JavaScript, webdev

Optimize NodeJS Apps in Production on Ubuntu

Why PM2 is Essential for Applications in Production?

When deploying a Node.js application in a production environment, ensuring stability, efficiency, and reliability is crucial. This is where PM2, a powerful process manager for Node.js applications, becomes an invaluable tool. PM2 simplifies process management, enhances performance, and provides robust monitoring capabilities. In this post, we’ll explore why PM2 is essential for running Node.js applications in production.

To ensure a Node.js app keeps running smoothly in production on Linux/Ubuntu, there are many ways to achieve this, but here are some of the essential steps that will help you elevate your application’s performance to the ‘next level’:

  1. Regularly monitor system resource usage to prevent bottlenecks
  2. Implement error handling and logging to quickly diagnose and fix issues as they arise
  3. Utilize process managers like PM2 or Forever to automatically restart your application in case of failures
  4. Ensure that your dependencies are always updated and secure to avoid vulnerabilities
  5. A bonus step: consider employing load balancing and clustering techniques to enhance the app’s scalability and availability. Nginx is great here even if you have one instance.

1. Use a Process Manager (PM2)

PM2 is a popular process manager for Node.js applications that provides automatic restarts, logging, and monitoring.

Install PM2 globally:

npm install -g pm2

Start your application with PM2:

pm2 start app.js --name myNodeJSAppButInProd

Managing different configurations for development, testing, and production environments can be cumbersome. PM2 allows you to define environment-specific variables using an ecosystem file:

module.exports = {
  apps: [{
    name: "my-app",
    script: "app.js",
    env: {
      NODE_ENV: "development",
    },
    env_production: {
      NODE_ENV: "production",
    }
  }]
};

This ensures that your application loads the appropriate settings based on the environment, reducing configuration errors.

Ensure PM2 restarts on reboot:

pm2 startup
pm2 save

Continue reading
Standard
Chrome, JavaScript, webdev

Top Resources to Learn JavaScript and TypeScript Effectively

JavaScript is the backbone of modern web development. TypeScript (TS)—its statically typed super-set — has rapidly gained traction in professional environments.

Whether you’re an aspiring developer or a seasoned programmer, this guide will help you level up your skills. It will assist you in navigating the learning path for JS and TS.

We’ll share various resources and courses to suit different learning styles. We will finish with three exciting project ideas to put your knowledge into practice.

Getting Started with JavaScript

Before diving into TypeScript, it’s crucial to have a solid understanding of JavaScript fundamentals.

Here are some steps and resources to get you started:

Continue reading
Standard