I made some recent forward progress on my side quest project soco-scribbler. This is an effort to revise the sonos-lastfm project, which uses SoCo under the covers, to log track info from Sonos speakers.
The screen capture below illustrates monitoring of three speakers and track logging from one that’s actively playing. The ultimate goal is to emit the track info to other systems such as an sqlite database or a message streaming platform like nats. But just handing off to Python logging is a good start.

The interesting bit is that I used OpenAI’s Codex CLI to flesh out and revise my broken handwritten first cut. Here’s the task list that I prompted Codex to create.
- [x] Rework the
scribbleCLI options insrc/soco_scribbler/soco_scribbler.py:18to remove Last.fm credential flow, keep interval settings, and add logging parameters. - [x] Convert
SocoScribblerinto a subclass ofSonosScrobblerthat sets placeholder Last.fm env vars, disables the Last.fm network, and accepts logging configuration. - [x] Implement helpers to ensure log storage, format timestamped entries, append to file/console, and override
scrobble_trackto log locally while updating history. - [x] Update the command body to use the new options, set interval env vars, drop credential/setup handling, and keep the monitoring loop via
run(). - [x] Validate the new CLI surface with
uv run python -m soco_scribbler.soco_scribbler --helpand manually confirm logging output without Last.fm submission. - [x] Introduce
platformdirsto resolve per-user config/data directories in an OS-aware way and refactor existing hardcoded paths. - [x] Update documentation/help text to describe the new config directory behavior powered by
platformdirs.
Not only did I subclass the SonosScrobbler class to hijack track
scrobbling but I specced out a bunch of other necessary but rote
tasks. After approving the plan, I just told Codex to “make it
so”. Thus the xs checking off task completion. The result worked right
out of the gate. There’s some subsequent human written adjustments to
handle a bit of an edge case, but I think I could have just thrown the
error message at Codex and it would have been fine fixing it.
Once I got up and rolling this was a quite pleasant experience. One that I might not have even given a go if not for agentic coding. As I’ve said in other venues, I’m skeptically optimistic but this decreases the level of skepticism a bit.