Andrew Roberts

@ajr.sh

software engineer • (re)posts about web, systems, cloud, maps, iOS, games

Lightweight AI planning (avoiding a "plan" or "spec" which easily gets out of date): Start PRs with an empty commit + include all of the planned tasks in PR title and description (using checkboxes) Then keep this up to date and check off the points as you / AI implement github.com/karlhorky/do...

https://github.com/karlhorky/dotfiles/blob/main/settings/.codex/agents.md?plain=1#L4-L12

# GitHub

- opening PRs
  - always make user review title and description before starting work
    - as usual: create a branch
    - create an empty commit with a title with the prefix `Add initial empty commit`
    - as usual: push the branch to GitHub
    - propose 3 possible PR titles along with 1 possible PR description, following your PR title and description rules
    - ask the user for approval
    - after any iteration and approval, create a PR with the approved title and description
    - once you're ready to commit the first time, amend the empty commit and force pushhttps://github.com/upleveled/youtube-private-invitations/pull/2

Example PR title and description:

Add endpoint sync with OpenAPI contract #2

Depends on PR #1

Manual sync in PR #1 lets channel owners paste add/remove invitees in YouTube Studio, so it works without a backend. Some teams already decide private-video invite changes outside the extension (eg. cohort tools, admin dashboards, CRMs), and need the extension to fetch those pending changes without background polling.

This PR adds endpoint sync on top of the manual YouTube Studio automation. The options page stores API request settings, and the popup fetches pending invitations only when the user opens it or refreshes it.

Before changing YouTube private-video invitees, the popup shows one pending invitation change:

affected videos
invitees to add
invitees to remove
previous/next controls
an Apply button
When the user clicks Apply, the extension opens the first pending video's YouTube Studio edit page for the native private-share seed save, applies the same invitee changes to the affected videos, and reports each result back to the endpoint.

TODO

- [ ] Add options page API request settings textarea
- [ ] Parse .http-style endpoint URL and request headers
- [ ] Fetch pending invitations from GET <endpoint> only from popup open or refresh
- [ ] Add popup pending-change preview, navigation, refresh, and Apply action
- [ ] Show add/remove invitees and compact affected video links before applying
- [ ] Collapse affected video links after 5 videos
- [ ] Open the first pending video's YouTube Studio edit page for the native seed save
- [ ] Detect ytcp-error-section.app-load for wrong active channel or inaccessible videos
- [ ] Ask the user to switch YouTube Studio channels manually when YouTube Studio blocks access
- [ ] Reuse YouTube Studio automation for add and remove actions
- [ ] POST each invitation result to <endpoint>
- [ ] Keep failed invitations pending by endpoint behavior
- [ ] Always send reque...

VoidZero is joining Cloudflare. Our mission stays the same: to make JavaScript developers more productive than ever before. Vite, Vitest, Rolldown, Oxc, and Vite+ remain MIT-licensed. Evan and the VoidZero team will continue leading them.

VoidZero + Cloudflare

🚀 New article on gap decorations (coming soon) in CSS. I have a small obsession with clean layout lines, and this is the first time it feels easy to draw them without polluting the markup. Goes through the new properties, a playground, and some experiments... 👾 utilitybend.com/blog/css-is-...

CSS is filling the gaps with rules. A way to style gaps in grid and flex. | utilitybend

A practical walkthrough of CSS gap decorations: column-rule, row-rule, rule-break, rule-inset, rule-visibility-items, repeat(), and animation.

utilitybend.com

💡 Use "using" for Vitest/Jest mocks/spys It's really nice to simplify You don't need manual mockReset / global afterEach cleanups anymore

Bild
Rob Palmer@robpalmer.bsky.social · 3mo ago

ECMAScript excitement 😉 Congrats to @chronicles.org on meeting the conditions for Explicit Resource Management to be Stage 4 at @tc39.es today 🎉 It introduces `using` declarations and the Symbol.dispose protocol to deterministically and ergonomically release resources 👍 github.com/tc39/proposa...

most of these github actions driven breaches are because of pull_request_target. here's some tips of what to look for when reviewing your own workflows. worth noting - it is safe, and necessary, when used correctly 🧵

Real DOM content in a canvas: fully searchable, translatable, inspectable. You can have forms, add WebGL effects & much more. Imagine if this was a customizable select 🤯 A little WIP exploration (not finished) for a very exciting API. github.com/WICG/html-in...

also it is so much EASIER to make comprehensive tests now if you know what you’re doing. in my three vibecoded projects i made the kind of tests i’d never bother to do before. and they saved my ass many times you do need to steer it to test the right things which requires some experience and taste

Simon Willison@simonwillison.net · 8mo ago

I see a lot of complaints about untested AI slop in pull requests. Submitting those is a dereliction of duty as a software engineer: Your job is to deliver code you have proven to work simonwillison.net/2025/Dec/18/...

I've heard folks express concern about React Router since the Remix 3 announcement Some variation of "is it on hold?"/"is it a secondary focus?"/"will it stop getting features?" etc No, No, and No 😀 To back it up, I thought I'd put together a little "React Router Wrapped" for 2025 🎄

Masonry: Things You Won’t Need A Library For Anymore: "#CSS Masonry is almost here! Patrick Brosset takes a deep dive into what this long-awaited feature means for web developers and how you could make use of it in your own work." www.smashingmagazine.com/2025/12/maso...

Masonry: Things You Won’t Need A Library For Anymore — Smashing Magazine

CSS Masonry is almost here! Patrick Brosset takes a deep dive into what this long-awaited feature means for web developers and how you could make use of it in your own work.

smashingmagazine.com