Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ GEM
PLATFORMS
aarch64-linux
arm64-darwin-21
arm64-darwin-24
universal-darwin-22
x86_64-linux

Expand Down
82 changes: 82 additions & 0 deletions _posts/2026-01-04-new-chromecast-project.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
---
layout: post
title: "Rebuilding Chromecast: From a Monolithic \"Nightmare\" to a High-Performance Standalone App"
description: Chromecast used to be a nightmare for our clients and our teams, here is the story of how we made it one of our most interesting and modern project while dramaticaly improving performance.
author: [a_gaudard]
tags: [chromecast, TV, web, javascript, frontend, player, video, performance]
color: rgb(251,87,66)
language: en
thumbnail: "/images/posts/2026-01-04-new-chromecast-project/thumbnail.png"
---
Comment thread
Art-G marked this conversation as resolved.

Chromecast can be a notoriously difficult platform to develop for. Over the years, the hardware has evolved significantly; while recent models are powerful, early versions are easily overloaded and struggle with modern web overhead.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This first paragraph is used on the homepage of the blog (= in the list of posts). And I think it lacks "something" to give reader an idea of what the post will bring. Maybe merge the next paragraph with this one?

Or: there is a metadata tag that can be used to specify which text to use on the home page, if you don't want to screw formating up.


At Bedrock, we faced a specific architectural challenge: our Chromecast project was living as a single route within our massive main web repository. While this "monolith" approach worked initially, our rapid growth eventually turned it into a bottleneck.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"massive main web repository" -> could that be a link to the blogpost about maintaining that 10 years old project? I think there is one such post.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great idea ! The only one I found is this one : https://tech.bedrockstreaming.com/2021/09/06/web-best-practices.html

I think it is close enough to add it as a link


## 📉 The Trouble with the Monolith

As the project scaled, we hit a wall with two primary issues:

**User Dissatisfaction:** Performance wasn't meeting our standards. One of our major clients has massive Chromecast traffic, and the laggy experience was becoming a significant pain point.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why was performance bad? One sentence is enough.


**Developer Dread:** The team grew to worry whenever a Chromecast ticket appeared in the sprint. Because it was tied to the main web project, it meant dealing with long, complex and painful developer experience.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One could argue painful DevXP must be a pain for "web" devs too. Why was this specific to chromecast devs? Maybe the chromecast parts where too tangled in the web repo?


## 🛠 The Challenge: Breaking Free

We couldn't change the hardware our users owned, so we had to change how our software interacted with it. We identified two core areas for improvement:

1. **Bloated Dependencies:** Because the Chromecast app was part of the main website, it was loading tons of irrelevant Javascript. We were essentially forcing a low-power device to carry the weight of a full desktop site.

2. **Deployment Velocity:** Our build and deployment processes were tethered to the main web project. We needed a workflow that allowed us to move fast without being slowed down by the main site's release cycle.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On these two points, there is a "why" explained 👍. I'd love to the the same thing on the two points earlier where I commented :-)

Or maybe this "brekaing free" section should be merged with the "The Trouble with the Monolith" section? Afterall, the two points in each section seem quite similar?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right !
Now that I added some details on the previous part (previews comments) I think it looks very similar to this section so I think I will merge those two.


## 🚀 The Solution: Chromecast Standalone
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Purely from a "form" perspective, I think a schema or image somewhere around here (= 1/3 of the post) would help make it more "breathable" 🙏


Following Bedrock’s **Request for Comment (RFC)** process, our Tech Lead conducted a deep dive into our options. The verdict? **It was time to move to a dedicated, standalone repository**.

This wasn't just a change of address; it was a total refresh:

- **Modern Tech Stack:** We adopted updated tools better suited for the platform.
- Typescript
- BiomeJS
- Vite
Comment thread
Art-G marked this conversation as resolved.
- Vitest

- **Transformed Developer Experience:** By moving to a standalone project, we completely overhauled how we work. We built custom simulation tools to replicate the Chromecast environment locally, drastically increasing feature velocity.

- **The POC:** To prove our theory, we built a Proof of Concept. It was a very simplified version of what would become the Chromecast Standalone, however we could do so much with so little that we were all convinced.
Comment thread
Art-G marked this conversation as resolved.

- **Project Architecture:** We choose the monorepo architecture for our Chromecast project to enforce best practices, improve code organization, and enable potential code reuse across projects.
- `apps/`: Contains the Chromecast receiver. It’s designed to be extensible, allowing us to add other targets (like Apple AirPlay) in the future while sharing the same core logic.
- `libs/`: The "source of truth" for reusable utilities. To prevent spaghetti code, these are strictly unidirectional: libs can import other libs, but they can never import from an app.
- `tools/`: Dedicated to the developer experience (DX). This houses non-production code like CLIs, documentation, and Storybook, keeping the main application bundles clean and light.
- `package.json` at root level: Centralizes all dev-dependencies and testing environments, ensuring consistency across the entire workspace.

## 📊 The Results: Impact by the Numbers

The results didn't just meet our expectations—they shattered them. By decoupling the project, we saw a significant and measurable increase in both stability and speed.

### Core Performance Metrics
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is one 3rd level title here, but it's the only one.

Use such a title if there is another 3rd level title later, but not if it's the only one?
In the current state of the post, I would remove the ###.


- **Video Join Time:** Reduced from **~5.8s** to **~2.8s** 🚀 (A massive **52% improvement**!)

- **IDLE / Pairing Page Load:** Dropped from **~7s** down to **~4s** ⚡

- **Stability:** We have witnessed significantly fewer critical performance variations, leading to a much more consistent user experience.

**Note:** We are still in the process of migrating our entire user base, but the data from the new implementation is already showing all the benefits.

![Join Time improvements](/images/posts/2026-01-04-new-chromecast-project/chromecast-standalone-join-time-2.png)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would write down something saying UserXP is much much better.
Metrics show it, and I would also say it to be 100% clear.

Also: in the problems at the beginning of the post, in addition to UserXP, there is DevXP => I'd love the see if DevXP is better now in this "results" section 🙏

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regarding DevXP: does this (smaller? more focused) repo help with AI-assisted development, for example? Has the duration of on-boarding of new colleagues been greatly reduced? Maybe cycle-time for new features has been reduced?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A metric you could show (if it's interesting) could be duration for builds. Maybe build time is now much shorter?


## 💡 Lessons Learned

Decoupling a core feature from a monolith is a major undertaking, but this project highlighted several key principles for success:

- **Validate via POC:** Building a Proof of Concept was crucial. It provided the data needed to prove that a standalone architecture would solve our performance issues before we committed to a full rewrite.

- **Platform-Specific Needs:** Low-power devices like the Chromecast don't just benefit from lean code—they require it. Tailoring the environment specifically for the hardware is often more effective than trying to optimize a shared codebase.

- **Autonomy Drives Velocity:** Removing the dependency on the main web project's build and deployment cycles did more than just speed up our workflow; it removed the "developer dread" by giving the team full ownership of their release process. This is valid for our chromecast team as well as our web team. Indeed their validation, homologation and release process don't need to include the Chromecast.

- **Data-Driven Buy-In:** Highlighting clear KPIs, like the 50% reduction in video join time, made it easy to demonstrate the ROI to stakeholders and justify the time spent on refactoring.

By focusing on these areas, we successfully transitioned from a technical bottleneck to a modern, high-performance application that our team is proud to maintain.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.