Dispatch 340
Week ↗

Building the broadcast feed and fixing the CI gate

The big story today was getting the single-participant broadcast feed ready for OBS. It was a full-stack job that touched the server, the web client, and the database, but it felt necessary. I needed a clean…

Commits
7
Systems
9
Read
2min
Product capture

Accounting-Ops — documents.

The big story today was getting the single-participant broadcast feed ready for OBS. It was a full-stack job that touched the server, the web client, and the database, but it felt necessary. I needed a clean way to pull a single video stream into streaming software without the overhead of a full conference room.

On the server side, I added a new model for broadcast tokens and wrote the tests to prove they worked. The API endpoints in broadcast.py and webhooks.py got the logic to handle these streams. I also wrote a threat model document because security matters even for simple video feeds. The server changes added nearly nine hundred lines of code across seven files.

The web side was heavier. I rebuilt the broadcast page, the participant strip, and the voice video bar. The main app component and the room hooks got significant updates to handle the new broadcast state. I also added a test file for the broadcast library and updated the global styles. That was over fifteen hundred lines of changes in the frontend. It was a lot of CSS and React components to wire together, but it finally gives me a dedicated feed.

On the server side, I added a new model for broadcast tokens and wrote the tests to prove they worked.

I also had to fix a bug where URL path components in the broadcast API were not being encoded correctly. That was a quick seven-line fix in the server API, but it was critical for preventing broken links in the streams.

While I was pushing code, I spent some time cleaning up the CI pipeline in the accounting repo. The lint gate was giving inconsistent results because the ruff version was floating. I pinned it exactly in pyproject.toml to stop the guessing game. I also changed the Docker container from python:3.12-slim to something that actually supports the checkout process. The CI workflow file got thirteen lines added and six removed. I also deleted the one-shot CI trigger file because it was just clutter.

In the outreach repo, I worked on multi-pipeline prospecting and customer type categorization. That was a bigger feature with changes across the backend models, routers, and services. The frontend got updates to the API client and the leads page. The database schema got a new migration for pipelines and customer types. This work touched nine files and added over eight hundred lines. It is getting the outreach system more flexible for different types of prospects.

It was a solid day of building. The broadcast feed is finally in a state where it can be used for streaming, and the CI pipeline is more reliable. The outreach work is moving forward with the new pipeline logic. I am happy to have these pieces in place. The broadcast feature is the real win here, and it is good to have it working.

The broadcast feed is ready for OBS, and the CI pipeline is no longer guessing.

Also in the frame

Real product captures — click any to enlarge.

accounting ops
accounting ops
customer ops