Sign in

iiinova is part of the Atmosphere — an open, public network where you own your identity.

Jamie Tanna

@www.jvt.me.web.brid.gy
358 followers 1 following 1.7K posts
PostsRepliesMedia
Jamie Tanna @www.jvt.me.web.brid.gy · 13h
Listened to a post on the-github-podcast.simplecast.com Post details
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 13h
Listened to The Pi Updates are insane - Syntax #1046 Post details
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 16/10/2026
Avoiding the dreaded `Expected — Waiting for status to be reported` when trying to make a status check optional.
jvt.me
Making an optional, required, status check with GitHub Actions
Something that I've hit time and time again over the years - but seemingly have never blogument'd - is that when you add a required status check on GitHub (in branch protection or a Ruleset), it needs to report back as successful before you can merge a given Pull Request. This is absolutely reasonable, and I don't think there are many complaints folks would have about this requirement. That is, until you want to consider how to handle checks that you don't necessarily want to run all the time. For instance, let's say you have a smallish monorepo where there is a mix of Java, backend Typescript and frontend React + Typescript. If you're only changing one of those parts of the codebase - or if you're fixing a typo in a Markdown file - you probably don't want to run all three suites of tests. There may be cases where the frontend needs to re-run its tests if there's a change in the backend code for instance if you've got tests that collaborate on the state of the API contract, but for the most part, the test suites only cover the changes in their part of the codebase. This results in the following set of status checks being enforced on a given PR: The ideal experience for a contributor to the codebase is that they don't want to run all these unrelated tests when they're modifying a scoped part of the codebase, but this isn't super straightforward with the way the status checks work, because if you do it wrong, you end up with a check that'll never pass: I've tried a few options over the years, and found that my preferred option is: * Use your primary workflow (i.e. `.github/workflows/bff.yml`) * Add a set of steps at the start of the workflow to determine files changed * If any files you want have changed, then run the workflow * If not, add a fake step to run as "successful" For instance, let's say that we have a repository like so: . ├── backend │   └── fake.Java └── ts ├── backend │   └── server.ts └── frontend └── Page.ts .github └── workflows ├── backend.yml ├── bff.yml └── frontend.yml And given the following workflow: name: Typescript backend tests on: push: {} jobs: backend-ts-linter: runs-on: ubuntu-latest steps: - name: Run the linter run: | # pretend that we're doing work sleep 12 backend-ts-build: runs-on: ubuntu-latest needs: - backend-ts-linter - backend-ts-tests steps: - name: Build app run: | # pretend that we're doing work sleep 2 backend-ts-tests: runs-on: ubuntu-latest steps: - name: Run the tests run: | # pretend that we're doing work sleep 9 If we wanted to make sure that this only triggers when there are any changes to the `ts/backend` directory, the best way of doing this is with: name: Typescript backend tests on: push: {} jobs: changes: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 with: persist-credentials: false # to allow us to check all changes fetch-depth: 0 - name: Determine whether relevant files changed run: | base="${{ github.event.pull_request.base.sha || github.event.before }}" # if it's a new branch / if triggered i.e. through a `workflow_dispatch` (not used in this Workflow) if [ -z "$base" ] || [ "$base" = "0000000000000000000000000000000000000000" ]; then echo "needed=true" >> "$GITHUB_OUTPUT" exit 0 fi changed_files="$(git diff --name-only "$base" "${{ github.sha }}")" if echo "$changed_files" | grep -qE '^ts/backend/'; then echo "needed=true" >> "$GITHUB_OUTPUT" else echo "needed=false" >> "$GITHUB_OUTPUT" fi backend-ts-linter: needs: changes if: needs.changes.outputs.needed == 'true' runs-on: ubuntu-latest steps: - name: Run the linter run: | # pretend that we're doing work sleep 12 backend-ts-build: runs-on: ubuntu-latest needs: - backend-ts-linter - backend-ts-tests steps: - name: Build app run: | # pretend that we're doing work sleep 2 backend-ts-tests: needs: changes if: needs.changes.outputs.needed == 'true' runs-on: ubuntu-latest steps: - name: Run the tests run: | # pretend that we're doing work sleep 9 With this, if we make a change that only touches `backend/fake.Java`, we will now correctly skip `backend-ts-build`: By using the `if` here, we're able to show the step as having been run, but skipped, which both satisfies branch protection, and is a bit clearer to reviewers to let them know that the check hasn't actually fully run. ## Honourable mentions ### Creating a "fake" implementation of a step At Elastic, we had an Organisation Ruleset which was enforced for repositories that used our then-docs platform, which would require a CI check to have run to validate the docs were well-formed. However, in cases where the docs weren't rebuilt - because they hadn't been touched - this led to `Expected — Waiting for status to be reported` being reported, which was frustrating, as we didn't want to run an expensive rebuild. Instead, we went with the approach of creating a "fake" Workflow. Using our example repo structure shown above, this would look like the following workflow: # NOTE that the `name` needs to be in line with the name of the workflow you're shadowing, otherwise, depending on how your branch protection / Rulesets are set up, this won't match name: Typescript backend tests on: push: paths-ignore: - ts/backend/** jobs: backend-ts-build: runs-on: ubuntu-latest steps: # NOTE that the `name` needs to be in line with the name of the step you're shadowing, otherwise, depending on how your branch protection / Rulesets are set up, this won't match - name: Build app run: | exit 0 This could also be used for the reverse case - for instance where a docs-only update should not trigger a build of your application which is required by your status checks. I prefer the clarity of the "skipped" check when using the `if`, but if you're not as bothered by that, using this "fake" Workflow works well too. ### Buildkite's `monorepo-diff` plugin I did really like working with Buildkite's CI platform, and plugins like the monorepo-diff Buildkite plugin provided a native primitive for this, allowing you to do things like: --- # SPDX-License-Identifier: Apache-2.0 # Via https://github.com/elastic/workshops__mcp-server-elasticsearch/blob/95c15e8ec5d4cfab1dd0b06a1188919b0ea5c0d7/.buildkite/pipeline.yml#L6 # $yaml-language-server: $schema=https://raw.githubusercontent.com/buildkite/pipeline-schema/main/schema.json steps: - label: "Triggering pipelines" plugins: monorepo-diff#v1.4.0: diff: ".buildkite/diff ${BUILDKITE_COMMIT}" wait: true watch: - path: "renovate.json" config: label: "Verify Renovate configuration" command: "renovate-config-validator" agents: image: "..." - path: "catalog-info.yaml" config: command: "/agent/check-catalog-info.sh" agents: image: "..." - default: config: label: ":pipeline: Upload default Pipeline" command: "buildkite-agent pipeline upload .buildkite/default-pipeline.yml" In this case, we could target specific changes based on whether file(s) had changed in a given part of the project, or even uploading a whole other set of pipeline steps. ### Do not use Workflow-level `paths` / `paths-ignore` As hinted at above, if you try and use `paths` / `paths-ignore` to skip the Workflow - to prevent any CI time being used for the job - you'll end up with a check that can't ever pass. For instance, the following workflow using `paths`: name: Typescript backend tests on: push: # NOTE: this is what breaks the check, as the whole Workflow doesn't run paths: - ts/backend/** jobs: backend-ts-linter: runs-on: ubuntu-latest steps: - name: Run the linter run: | # pretend that we're doing work sleep 12 backend-ts-build: runs-on: ubuntu-latest needs: - backend-ts-linter - backend-ts-tests steps: - name: Build app run: | # pretend that we're doing work sleep 2 backend-ts-tests: runs-on: ubuntu-latest steps: - name: Run the tests run: | # pretend that we're doing work sleep 9 Will lead to the following `Expected — Waiting for status to be reported`: ### CodeCov While looking at this at work most recently, I found that the CodeCov GitHub App was a required status check on our branches. In our `backend-tests` job, we'd run the unit tests and then upload code coverage stats to CodeCov - but if we were skipping the `backend-tests` (as unrelated files had changed) there was then no way to make the CodeCov check pass. Fortunately, CodeCov have hit this as an issue enough to provide the `empty-upload` primitive, so in their GitHub Action you could do i.e. backend-ts-linter: needs: changes if: needs.changes.outputs.needed == 'false' runs-on: ubuntu-latest steps: - name: Simulate a CodeCov scan uses: codecov/codecov-action@v5 with: run_command: empty-upload force: true ### GitHub's docs GitHub does have some docs about this but their primary solution is: > Avoid requiring workflows that can be skipped. Which isn't super helpful.
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 16/10/2026
How to stop `Can't open display: (null)` errors blocking you interacting with Xorg in `tmux`, for instance after an X crash.
jvt.me
Reattaching tmux to your Xorg session
It happens infrequently enough to not investigate too much further, but sometimes I'll end up with my Xorg/X11 session crashing, or something else happening which leads to my existing `tmux` sessions failing to interact with the new X session, with errors like: % gh repo view --web Opening ... in your browser. Error: cannot open display: :0 % xsel xsel: Can't open display: (null) : Connection refused In this case, the existing panes/windows may end up seeing a related error about failing to connect to the display, but any new panes/windows created will be able to interact as expected. This is a bit of an annoying one, but one way we can solve this is to nudge these panes to use the new `DISPLAY`. In a new pane/window/terminal session, check the `DISPLAY` environment variable: % echo $DISPLAY :1 That's likely different to what it shows in one of those existing panes - if so, run: % export DISPLAY=:1 After which, you can then run commands that interact with your X session. It's possible to run: % tmux set-environment DISPLAY :0 Which will update all _new_ panes - but as mentioned, `tmux` likely already handled that for you, as `DISPLAY` is one of the environment variables it updates, as per: % tmux show-options -g update-environment update-environment[0] DISPLAY ... Instead of doing this by hand, it's also possible (Via) to script this to ??.
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 16/10/2026
Listened to Leprechaun in the Hood w/ Kumail Nanjiani (Classic) Post details > How Did This Get Made? · Episode
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 15/10/2026
Listened to John Cena | Off Menu with Ed Gamble and James Acaster Post details > Listen to John Cena from Off Menu with Ed Gamble and James Acaster. WWE legend-turned-acting A-lister John Cena is this week’s dream diner. He sits down with Ed and James to talk about his coffee obsession […]
jvt.me
Original post on jvt.me
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 14/10/2026
Listened to teamcoco.com/podcasts/conan-obrien-… .
teamcoco.com
"Kyle MacLachlan" on Conan O'Brien Needs a Friend
Actor Kyle MacLachlan feels fortunate about being Conan O’Brien’s friend. Kyle sits down with Conan to discuss his new memoir Fictional Selves, how being plucked from the stage to star in the 1984 adaptation of Dune led to a lifelong collaboration with director David Lynch, and bringing a unique eccentricity to his iconic role as Agent Cooper in Twin Peaks. Plus, Conan responds to a listener voicemail about where this world is going. For Conan videos, tour dates and more visit TeamCoco.com. Got a question for Conan? Call our voicemail: (323) 362-2295. Get access to all the podcasts you love, music channels and radio shows with the SiriusXM App! Get 3 months free using this show link: https://siriusxm.com/conan. Hosted by Simplecast, an AdsWizz company. See pcm.adswizz.com for information about our collection and use of personal data for advertising.
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 14/10/2026
Listened to Close Encounters of the Human Kind - Fallthrough Post details > How should we spend our time now that writing code is cheap? In this episode, Kris and Matt are joined by Doug Soo, a staff engineer working on the storage systems at Honeycomb. They discuss his…
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 14/10/2026
Listened to Stack Overflow Survey Reactions | Software Engineering & Career Insights by Overcommitted | Software Engineering and Programming Insights Post details > What does Stack Overflow’s 2026 Developer Survey reveal about software engineering, career insights, and engineering culture? The […]
jvt.me
Original post on jvt.me
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 14/10/2026
Listened to teamcoco.com/podcasts/where-everybo… .
teamcoco.com
"Gillian Jacobs" on Where Everybody Knows Your Name
This week Ted Danson’s making a new friend, actor Gillian Jacobs. Gillian shares about her experience at Juilliard, her new movie “The Musical,” her journalism side job, the nerve-wracking story of how she got the role of Britta on “Community,” and more. Check out Gillian’s work: Glamour interview with American computer scientist Jean Sammet 99% Invisible episode, “The Bone Wars” “Periodic Talks” interview with Mary Steenburgen Like watching your podcasts? Visit http://youtube.com/teamcoco to see full episodes. Hosted by Simplecast, an AdsWizz company. See pcm.adswizz.com for information about our collection and use of personal data for advertising.
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 14/10/2026
Listened to Paul F. Tompkins (Tasting Menu) | Off Menu with Ed Gamble and James Acaster Post details > Listen to Paul F. Tompkins (Tasting Menu) from Off Menu with Ed Gamble and James Acaster. Fan favourite from way back in Series 3 of Off Menu, US podcasting royalty and ‘Bojack Horseman’ star […]
jvt.me
Original post on jvt.me
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 14/10/2026
I will say that you may get side eyes from a subset of the Go community for not using the standard library, and especially using an ORM - I say "fuck 'em" and that if the tools work for you, that's great. But there's a (vocal majority/minority) that is quite keen on not using some of these […]
jvt.me
Original post on jvt.me
010 1
Jamie Tanna @www.jvt.me.web.brid.gy · 13/10/2026
Listened to Ep 51: Paul F. Tompkins | Off Menu with Ed Gamble and James Acaster Post details > We’re in sunny Los Angeles and our first Hollywood guest is podcasting king and ‘Bojack Horseman’ star Paul F. Tompkins!
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 13/10/2026
Listened to Honey, I Shrunk the Binary - Continue Post details > Welcome to Continue: Go Proposals edition! Each edition of this show will handle a specific topic that can be covered continuously. This edition is for Go Proposals. Each week Kris and Matt will…
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 13/10/2026
Listened to How many engineers does it take to deprecate a struct? | Cup o' Go Post details > Seems like more than one! Visit cupogo.dev for all the things. This week: Go 1.27.2 and Go 1.26.9 are released Accepted: add cgo without a C toolchain as a GOEXPERIMENT (and the original one) Accepted […]
jvt.me
Original post on jvt.me
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 13/10/2026
Listened to October 12th, 2026 — Infrastructure Frontiers Post details > Episode 11 of Infrastructure Frontiers with Mahir Lupinacci. Industry Experts run down all the AI news for Infrastructure Engineers. Adam Jacob, Paul…
swamp-club.com
October 12th, 2026 — Infrastructure Frontiers
Episode 11 of Infrastructure Frontiers with Mahir Lupinacci. Industry Experts run down all the AI news for Infrastructure Engineers. Adam Jacob, Paul…
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 13/10/2026
Listened to Open Source Security Post details > Open Source Security is a media project to help showcase and educate on open source security. Our goal is to give the community a platform educate both developers and users on how open source security works. There’s a lot of good work happening […]
jvt.me
Original post on jvt.me
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 13/10/2026
Listened to The Delta Flyers Post details > Listen to The Delta Flyers on RedCircle
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 12/10/2026
Listened to The Delta Flyers Post details > Listen to The Delta Flyers on RedCircle
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 12/10/2026
Writing a custom hook to convert a 'Claude is waiting for input' to a Pushover push notification.
jvt.me
Adding Pushover notifications to Claude Code
There are times that you're away from your machine - or you've got so many terminal sessions you've not seen a notification - to say that your agent is waiting for input. Although there are ways to get first-class support for this - for instance Claude Code's Remote Control (which only works if using a Claude Code subscription, i.e. Bedrock users don't get access to it) - I wanted to write a tiny bit of Go code today, and thought I'd hand-roll some notifications. Given the Notification hook, this is actually fairly straightforward. To get a notification, you need to wire in the hook i.e. my `~/.claude/settings.json` looks like: { "hooks": { "Notification": [ { "matcher": "", "hooks": [ { "type": "command", "command": "~/bin/_claude-hook" } ] } ] } } Then, my `_claude-hook` is a lightweight wrapper: #!/usr/bin/env bash source ~/.secrets/claude-hook claude-hook notification This is then a very small CLI which allows me to call the Pushover API given a set of inputs. In its first iteration, it echoes the message from Claude - but I'll follow-up to add some more insight into what session it's coming from. For now, I'm using a single CLI for Claude Code. If I get back to using multiple harnesses again (especially now `crush` has at least started to add hooks), I'll probably amend this to be i.e. -claude-hook notification +agent-hook claude notification So then I can share the same underlying codebase for the multi-agent setup - but there's no point in prematurely optimising when that's not the case! (Oddly, this works on my work Mac, but not on my Linux laptop - I need to investigate further)
010 1
Jamie Tanna @www.jvt.me.web.brid.gy · 12/10/2026
Listened to The Delta Flyers Post details > Listen to The Delta Flyers on RedCircle
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 12/10/2026
Listened to From zero to NanoClaw with Gavriel Cohen, creator of NanoClaw (Changelog Interviews #686) Post details > Gavriel Cohen, creator of NanoClaw and co-founder of NanoCo, joins Adam to explain how a 40-hour weekend project became a viral open source hit and the foundation of an […]
jvt.me
Original post on jvt.me
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 11/10/2026
What happened in the week of 2026-10-05?
jvt.me
Week Notes 26#41
* A busy but very rewarding week at Open Source Summit (Europe) and the OpenSSF Community Day * It was a very social week - I ended up chatting to some folks I've worked with in the Open Source ecosystem, as well as meeting a lot of other big names, which was very cool! * I ended up going to all the socials I could do - which was good - and found that I enjoyed a lot of hallway track this time - I ended up bumping into a few folks who I had a number of things to talk about, and Sebastian and I had a lot of chats about different Renovate-y things * (I'll do my full write-up hopefully this week - it's not an in-depth writeup!) * And now I have such a long TODO list of things to plan to do off the back of the conference 🫣 But all very good things - it's been a good week talking about Renovate-y things, and more general supply chain security * I was mostly good with my travelling, aside from: * Losing my hoodie on the first leg of my journey, rushing out of the plane (due to a delayed arrival, and not a lot of turnaround time) * Which was made worse by the fact that I'm not sure if it wasn't signposted correctly, but accidentally left the arrivals area (through to departures) when I got to BGY * I forgot my second travel adapter - with one USB-C cable (and the battery on my work M4 MacBook Pro), I managed to survive with only that, but it was a bit tense! * Found out that I'm in the top 4% of people found "in the weights" of AI models, which is cool (and also sad that they've trained off much of my content) * Wrote a couple of cheeky posts mid-conference, and finished off a bigger post about Logs as UX * On the flight on the way, I thought I'd see if Qwen could help me generate the log snippets for 👆🏼 and almost melted my legs with it * During one of the talks, there was someone cutting their nails 😬🤮 * Although we thought the leaky radiator was sorted, and so closed up the floorboards while I was away, it seems to have gotten worse through the week - when I was back, we took a look on Saturday, and it looks like I'd knicked one of the water pipes, leading to a bit more leakage (especially when the boiler is on) than with the leaky radiator * Means it's a bit chilly, but luckily we have layers * But Cookie's enjoyed having another blanket to monopolise * A wet-and-dry vacuum cleaner has made short work of the leakage, though, which is good * It was great to get some time to spend with Sebastian (our first time meeting in person), and I love that when you don't get to see a colleague that often, you get the chance to catch up as humans, as well as little chats like "oh, what do you think about ..." which isn't _as_ easy to do when you're fully remote + async (but we still do some of it, but it's been a lot quicker this week!) * Andrew and I spent a fair bit of the week talking about various bits in Renovate we could do to improve ecosystem security, supporting package maintainers, and I had chats with various other folks about different areas that we could support + improve things * Was surprised to win the Lego PlayStation 1 at the Valkey booth! * I wasn't a fan of the fact that the (slightly redacted) emails were shown on screen - yes they can be guessed, but I don't remember consenting to that when I submitted for the competition 😬 * But I let Sebastian take the Lego home - he and his kid would enjoy it more, and it would be a bit easier to transport home 🤞🏼 * We've almost finished the London Underground jigsaw * Announced our proactive upgrades for big Open Source projects, which I've been wanting to do for a bit * It's a shame we didn't get an "OK" in time from more of the projects to confirm if they were happy being posted about, as there are some really big projects that are using us! Playing: * (No _Blue Prince_) * _Kingshot_ (per usual) * A tough KvK - I did ~50M power worth of upgrades, but even for one of our alliance members getting 77M points, that only just scraped into the top 10 😳 * _Apex Legends_ * _Cat Snack Bar_ * As I needed something to do when on a plane Reading: * _The Sins of Our Fathers_ Watched: * (No _The Expanse (Season 5)_) * _Taskmaster (Series 22)_ * (No _Furiosa: A Mad Max Saga (2024)_) * _The Celebrity Traitors (Series 2)_ * _Ted Lasso (Season 3)_ * _Saturday Night Live (on YouTube)_ * _The Big Short (2015)_
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 11/10/2026
Listened to The Delta Flyers Post details > Listen to The Delta Flyers on RedCircle
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 11/10/2026
Listened to podcasts.apple.com/us/podcast/unima… .
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 10/10/2026
Listened to podcasts.apple.com/us/podcast/the-h… .
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 10/10/2026
Listened to The Delta Flyers Post details > Listen to The Delta Flyers on RedCircle
000 0
Reposted by Jamie Tanna
Renovate @renovatebot.com · 10/10/2026
Wanting to continue to give back to the community, we've recently proactively given 184 open source organizations to our Community (OSS) plan on Renovate Cloud 🚀 www.mend.io/blog/renovat...
mend.io
Renovate Community (OSS) plan: 184 projects upgraded
Mend.io proactively upgraded 184 open source organizations to the Renovate Community (OSS) plan, with higher limits and Merge Confidence included.
112 2
Jamie Tanna @www.jvt.me.web.brid.gy · 09/10/2026
Listened to podcasts.apple.com/us/podcast/fury/… .
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 09/10/2026
Listened to podcasts.apple.com/us/podcast/muse/… .
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 09/10/2026
Listened to podcasts.apple.com/us/podcast/live-… .
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 09/10/2026
Listened to podbay.fm/p/how-did-this-get-made/e… .
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 09/10/2026
Looking at how logs being the main interface for understanding how tools work can be a blessing and a curse.
jvt.me
Logs as UX
A few years ago, Ryan wrote about how Bridgy, a service I use a lot, exposes log as the end user UI. This is a post that's stuck with me over the years, especially as someone whose work has generally comprised of building tools for others. I think about this post every so often with how in Renovate, our logs are _the_ interface that users, operators, and support teams get into understanding what's going on under the hood. More generally, I think that focussing on your user-facing logs can be a key area to improve the experience for users of your software. (This make sense for a subset of applications - if you're building a SAAS platform or a mobile app, you may have different avenues to expose this information) ## They're there 🤷 At the laziest level, it's pretty likely that the software you're using already has logs available - often to be provided to the vendor to help support your usage. These logs are often written to disk in plain text, which means you as a human can read them without any extra tooling, making them more accessible for debugging. You may need extra configuration to increase the log level (see below) but it's often something within your control. ## Logs as an empathy builder As well as being the Renovate Project Lead, I am also the Community Manager for the project. One of the aspects of being the Community Manager - as well as part of my internal role at Mend including supporting Mend's Enterprise customers - is that I work through issues our other users are seeing with their Renovate setups. As part of this, I spend a chunk of time reading through debug logs, working to understand the situation they're in, and seeing how we can unblock them (in the short term) and stop it from happening (in the medium term). This puts me - and the other collaborators and maintainers on the project - in a particularly strong position to increase our empathy for our users. I could argue that Renovate's logs are "the great equaliser", because for me - as someone who supports Mend-hosted apps for > 1 million repositories for our customers and free users alike - I have _exactly the same_ debug logs as a user who runs the Renovate CLI themselves. This means that if _I_ can't work out what an issue is with the information in our logs, I can feel confident others will not either. Not only do we spend a lot of our time debugging with those logs, but also hearing from users' questions and/or feedback, we can understand where there is a gap in understanding between us (as folks more familiar with Renovate's internals) and users who are likely not as familiar. As an example, Renovate's JSON log objects are fairly straightforward to read, and the most minimal version of a log would be i.e. { "hostname": "caerbannog", "level": 20, "logContext": "cdc129f3-d03a-4501-8168-d7d54a874601", "msg": "Using RE2 regex engine", "name": "renovate", "pid": 73914, "time": "2026-09-04T16:10:05.909Z", "v": 0 } Where we have extra information that is useful to share, we'll add it into extra keys on the JSON object (like `renovateUsername`) or with nested JSON objects (like `platformConfig`): { "hostname": "caerbannog", "level": 20, "logContext": "cdc129f3-d03a-4501-8168-d7d54a874601", "msg": "Platform config", "name": "renovate", "pid": 73914, "platformConfig": { "host": { "apiUrl": { }, "type": "github" }, "isGHApp": false, "userDetails": { "email": null, "id": 3315059, "name": "Jamie Tanna", "username": "jamietanna" }, "userEmail": null }, "renovateUsername": "jamietanna", "span_id": "cba6adce61f91cd4", "time": "2026-09-04T16:10:06.682Z", "trace_flags": "01", "trace_id": "323ee7f13437b849dd4dbd3ad00f94ae", "v": 0 } Over the years we've improved - and continue to improve - what information we present in our logs, and each time we find a situation where it'd be more useful to have a debug log to investigate what's going on, we'll add it in, whether as a new log line, or as a new key in the JSON object that we already output. We realise that there's always room to improve, and something that makes sense to us may not make as much sense to someone with a slight familiarity with Renovate - we very much welcome suggested improvements. I'll also note that in the last year, we're made some significant investments in improvements to our OpenTelemetry traces, which provide a slightly different window into the same underlying Renovate process, which I'm currently using to investigate some key areas for improvements on how Renovate runs on large repositories. ## Logs require curation Having a system that is observable is the goal for many operators of systems. But one of the negative areas about adding any level of observability - aside from having a debugger attached to a process in production - is that it requires prior consideration. A log message, tracing span or outputted metric only exists because someone has written one in the codebase, and that's trickled through into the release version you're now running in production. Unfortunately, this also means that when this improved logging is available in a newer version of the software, it's often not possible to apply that retrospectively to an existing run of the software, so you need to i.e. hit that error case again to understand what's going on. Although I'm fortunate that I have a bit more weight in being able to contribute new logs to Renovate, as software engineers (and users of software) we generally don't have access to modify all our software, which means it's not always possible to contribute new logging to the tools we depend on. I think we strike a good balance with Renovate, as we do consider what logs we have and how we want to present them to the user, and provide a bit more of a considered log than Bridgy's (intentionally) more terse log format. ### `--very-very-verbose` With Renovate, we try and keep our most important information in the `INFO` log level (and above), so operators and users can be sure that they only see the most actionable information at higher log levels. That being said, we still recommend that self-hosted administrators use the `DEBUG` log level where possible, as using `DEBUG` log level for all Mend-hosted users, as there is a lot of useful information in there, which isn't quite worthy of being promoted up to `INFO`. I was recently chatting with a Renovate user who (rightfully) described our logs as: > renovate debug logs are both verbose and illuminating This is a fair assessment, and some of it is a byproduct of our decision to keep our most actionable information in `INFO`+ log lines, meaning we have a lot of information that we relegate to the `DEBUG` log level (or to `TRACE)`). We can't predict _exactly_ which lines a given user would want, and want to avoid making our `INFO`+ logs too noisy, but there's definitely a balance here, on top of the constraints we've put on ourselves, and we do periodically review what could be elevated to an `INFO` log line. One thing I miss about my days in Java was that with SLF4J (and the logging adapters like Log4J) you could provide per-package logging configuration, allowing you to hone in on authentication-handling code, but ignore more in-depth debugging for filesystem operations. If you're able to expose some more control to your users around exactly what gets logged, that can provide a lot of extra control and value, which can help reduce some of the verbosity that some users may find, as they can then turn off areas they're not interested in. (Renovate does have the logLevelRemap config option to move logs from one level to another, which isn't quite the same) ## Is it even safe to turn up the log level? As I've talked about before, there are a lot of people logging things they really shouldn't be. Depending on what software you're using, it may not be safe to enable `DEBUG` logging, because the logs may expose secrets or private information that shouldn't be seen outside of non-production environments. Whereas tools like Renovate work _very_ hard to sanitise secrets that hit our logs, not all tools are equal. Back when I worked at Capital One, we couldn't turn on `DEBUG` logging for our identity server because the commercial-off-the-shelf solution we had for it would log full cookies, access tokens, and more - which isn't ideal when this meant someone could use that to access customer data 😅 So instead, it meant we only had `INFO`+ logs to work with. ## Log aggregators may ruin your day One of the things I disliked greatly while working at Elastic was that all our log aggregation went through - you guessed it! - the Elastic Stack. Now, the Elastic Stack _itself_ is fine, but for our log aggregation, we would add additional meta information to log lines, for instance to say "this is the Kubernetes cluster, in this region, that the workload is running on." As noted above, Renovate's JSON log objects are fairly straightforward to read, with a more complex object which looks like so: { "hostname": "caerbannog", "level": 20, "logContext": "cdc129f3-d03a-4501-8168-d7d54a874601", "msg": "Platform config", "name": "renovate", "pid": 73914, "platformConfig": { "host": { "apiUrl": { }, "type": "github" }, "isGHApp": false, "userDetails": { "email": null, "id": 3315059, "name": "Jamie Tanna", "username": "jamietanna" }, "userEmail": null }, "renovateUsername": "jamietanna", "span_id": "cba6adce61f91cd4", "time": "2026-09-04T16:10:06.682Z", "trace_flags": "01", "trace_id": "323ee7f13437b849dd4dbd3ad00f94ae", "v": 0 } The trouble is that depending on how your log ingestion is set up, it may result in large log object like: { "_index": "filebeat-8.17.0", "_source": { "@timestamp": "2026-09-04T16:10:06.682Z", "message": "Platform config", "log": { "level": "info", "file": { "path": "/var/log/containers/renovate_caerbannog_prod_f47ac10b-58cc-4372-a567-0e02b2c3d479_renovate_9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a.log" }, "offset": 46032 }, "renovate": { "name": "renovate", "logContext": "cdc129f3-d03a-4501-8168-d7d54a874601", "pid": 73914, "v": 0, "renovateUsername": "jamietanna", "span_id": "cba6adce61f91cd4", "trace_id": "323ee7f13437b849dd4dbd3ad00f94ae", "trace_flags": "01", "platformConfig": { "host": { "apiUrl": {}, "type": "github" }, "isGHApp": false, "userDetails": { "email": null, "id": 3315059, "name": "Jamie Tanna", "username": "jamietanna" }, "userEmail": null } }, "kubernetes": { "pod": { "name": "caerbannog", "uid": "f47ac10b-58cc-4372-a567-0e02b2c3d479" }, "namespace": { "name": "prod" }, "container": { "name": "renovate" }, "node": { "name": "minikube" }, "labels": { "app": "renovate", "app.kubernetes.io/managed-by": "helm" } }, "container": { "id": "9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a" }, "host": { "name": "minikube" }, "agent": { "type": "filebeat", "version": "8.17.0" }, "input": { "type": "log" }, "ecs": { "version": "8.17.0" }, "tags": [ "forwarded" ] } } This extra bloat is useful to some folks, but it hides a lot of the detail of what Renovate is telling the user. Another common issue I had at Elastic was that the shared logging index that we used for all workloads would inevitably have some disagreements of what a log field's shape should be. A common complaint with Renovate's logs - that I share - is that the `level` is a numeric value, instead of a string like `WARN` or `DEBUG`. Depending on what control you have in your organisation, you may then end up in a position where if a previous workload has defined what i.e. the `level` field should look like, you may not be able to write complex queries on your own logs if they disagree in format. Another issue I've seen with log aggregators is that they may ingest logs nicely, but put them into a string envelope, which results in this horrible nested JSON string that's mildly annoying to decode: { // ... "message": "{\"name\": \"renovate\", ...}" } ## Not all logs are rendered equally When you do have the logs, and they've not been mangled by a nasty log aggregator, how do you then view them? Do you read the raw newline-delimited JSON logs in your editor? Do you pretty print them as formatted and syntax-highlighted JSON objects? Do you convert them to another format like Canonical Log Lines? Do you use a generic log-viewing tool like lnav? As I've written about before, when reading Renovate's log lines, I want something that understands the domain-specific terminology and logging conventions that Renovate uses, rather than using something more generic. This meaningfully improves my time reading logs - of which, I spend a lot of my week doing so! - and I recommend considering what other common log files you interact with that you may find useful to have some more targeted tooling for. I'd recommend you consider building your own tools to provide an even more enjoyable experience for your tools' logs - which, if you have spare cash for the AI overlords, could be quicker than you think. ## Logs as input tokens A few years ago, if someone was in the middle of debugging and wanted to understand i.e. Renovate worked, they had a few options: * read the documentation (and hope it covered what they were looking for) * see if they could piece together any log lines from the codebase, and understand some of the flow * make their best guess at what's going on In the world of AI, it's now a little more straightforward if you want to put an agent on the job - you can take the debug logs and point an LLM at them, as well as a copy of the codebase, and it'll be able to get some of the way quicker than you may have. Now, it won't necessarily be correct, nor super efficient, but it's perhaps a little more likely to be correct than someone unfamiliar with the codebase guessing, and one option available to folks debugging. It's an interesting development that in the last couple of years, the industry has finally been improving documentation for new contributors, but it's being driven by AI agents rather than humans who've needed this documentation for years. ## Closing thoughts I find logs to be a really valuable piece of observability into how a piece of software works, and recommend you invest in your own logs as a way to provide better user experience. They're usually the key interface users and operators alike get into understanding how your software works, so you should "eat what you cook" and use the logs as your own primary tool for own debugging, to provide you greater empathy for your users, and understand where the gaps in observability can be improved. Although a log aggregator may mangle the logs as they exist, I recommend explicitly designing how you want your logs to look and work. It may sound weird to think of "designing" your logs, given they're plaintext or JSON, so how much you can you really "design"? But thinking about whether you're going to use `INFO` level heavily or move more information into `DEBUG`, or how you want to design the JSON layout for your structure logging, as well as considering how you safely redact PII or secrets. Ryan's post about how Bridgy has designed their logs to be terse and minimal, yet valuable, provides a different option to what I strive for - but both are reasonable options, as long as you're intentional with the design. Build a more curated set of logs and your users, operators, and future-you will be appreciative. And if you decide you don't want to invest in them, or you're happy them being more terse, be intentional about that choice.
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 08/10/2026
Listened to Breaking Change v49 - Saving Face Oil by Justin Searls Post details > I'm about to get on a plane and will be gone for a couple weeks, but didn't want to leave you Breaking Changeless so I did the thing where I stand up in front…
justin.searls.co
Breaking Change v49 - Saving Face Oil
I'm about to get on a plane and will be gone for a couple weeks, but didn't want to leave you Breaking Changeless so I did the thing where I stand up in front…
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 08/10/2026
How to take a pretty-printed JSON string and replace it with a minifed JSON string using `jq`.
jvt.me
Minifying JSON with jq
As an improvement to my version with Python or with Ruby, with tools like `jq` now being widely used, how do we minify a JSON string? Given: { "key": [ 123, 456 ], "key2": "value" } We can override the `--indent`: % jq --indent 0 . < a.json {"key":[123,456],"key2":"value"}
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 08/10/2026
A known documented, but maybe lesser known, fact about GitHub Custom Properties' values and descriptions being available to anyone with `read` access.
jvt.me
Gotcha: GitHub Custom Properties are public
I was speaking to someone the other day - while I've been at Open Source Summit (Europe) - about the great Custom Properties that GitHub added in ~2023. However, they weren't aware that they're available to anyone with read access to the repo - which means for a public repo, that's everyone! This was something we found at Elastic while we were rolling out something that sounds pretty juicy called `security_level`. This was a mandatory field across all our repos, which was set to a reasonable default value. We ideally wanted to have our Custom Properties' descriptions include more context about what the security level fields meant, and a link to our internal docs for more in-depth information and how to change it. At Elastic we had a lot of Open Source (and public repos which are not-Open Source), which meant that anyone would be able to look up the descriptions of these fields. We can see this in action on i.e. `github/gh-stack` by using the API: [ { "property_name": "client-app", "value": "false" }, { "property_name": "CodeQL-Block", "value": "true" }, { "property_name": "dependency-review-action-enabled", "value": "true" }, { "property_name": "deployable", "value": "false" }, { "property_name": "durable-ownership-check-enabled", "value": "false" }, { "property_name": "ownership-name", "value": "@github/pull-requests" }, { "property_name": "ownership-type", "value": "Team" }, { "property_name": "repo-mirror-ci", "value": "disabled" }, { "property_name": "repo-mirror-strategy", "value": "standard" } ] You can also see this in the web UI, which can be found on each repo's homepage, following the link to "Custom Properties". Notice that in the web UI, you can see the description of the field, which isn't - as far as I can find - available through an API call if you're not part of the organisation. This does appear to be visibly documented by GitHub - but is something folks seem to not be aware of!
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 07/10/2026
Listened to Breaking Change v56.0.1 - Zach Holman wants more of everything by Justin Searls Post details > Zach Holman, founder of Signed, joins me for another 🔥Hotfix🔥. Zach wants more of everything. Let's see what we can do about that. Write into the show at…
justin.searls.co
Breaking Change v56.0.1 - Zach Holman wants more of everything
Zach Holman, founder of Signed, joins me for another 🔥Hotfix🔥. Zach wants more of everything. Let's see what we can do about that. Write into the show at…
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 06/10/2026
Listened to www.iheart.com/podcast/143-how-did-… .
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 06/10/2026
Listened to www.iheart.com/podcast/143-how-did-… .
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 06/10/2026
Listened to www.iheart.com/podcast/143-how-did-… .
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 06/10/2026
Listened to October 5th, 2026 — Infrastructure Frontiers Post details > Episode 10 of Infrastructure Frontiers with Seth Falcon. Industry Experts run down all the AI news. Adam Jacob, Paul Stack, and Nick Stinemates are joined…
swamp-club.com
October 5th, 2026 — Infrastructure Frontiers
Episode 10 of Infrastructure Frontiers with Seth Falcon. Industry Experts run down all the AI news. Adam Jacob, Paul Stack, and Nick Stinemates are joined…
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 05/10/2026
Anyone at #OSSEU know where - ideally near the venue - to get a UK-to-EU travel adapter? I dun goofed and only brought my USB-C adapter and forgot my laptop needs to charge 😅
001 1
Jamie Tanna @www.jvt.me.web.brid.gy · 05/10/2026
Listened to Expend4bles LIVE! w/ Jessica St. Clair Post details > How Did This Get Made? · Episode
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 05/10/2026
Listened to Double Dragon LIVE! (Classic) Post details > How Did This Get Made? · Episode
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 05/10/2026
Listened to goodpods.com/podcasts/how-did-this-… .
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 05/10/2026
Listened to Battlefield Earth w/ Rob Huebel (Classic) Post details > How Did This Get Made? · Episode
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 05/10/2026
Listened to Disclosure w/ Nick Kroll & Emily Altman (Classic) Post details > How Did This Get Made? · Episode
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 05/10/2026
Listened to Jonathan Livingston Seagull LIVE! - Earwolf Post details > The HDTGM crew are LIVE from the Beacon Theatre in New York to break down the 1973 tale of a rebellious young seagull who just wants to fly fast and ends up... in outer space?!
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 05/10/2026
Listened to Open Source Security: Dependency attacks in 2026 with James Matchett Post details > Josh chats with Jeff Matchett from Cloudsmith about a new report they put out. It has some scary looking statistics in it about how organizations are using dependencies. There are some surprising […]
jvt.me
Original post on jvt.me
000 0
Jamie Tanna @www.jvt.me.web.brid.gy · 05/10/2026
Listened to Time Cop LIVE! W/ Nick Kroll (HDTGM Matinee) - Earwolf Post details > Nick Kroll (Oh, Hello on Broadway, The House) returns to join Paul, June, and Jason to discuss the 1994 Jean-Claude Van Damme movie Timecop.
010 1