Follow Friday 2-27-26
2026-Feb-27, Friday 13:45Here's the plan: every Friday, let's recommend some people and/or communities to follow on Dreamwidth. That's it. No complicated rules, no "pass this on to 7.328 friends or your cat will die".
[dreamwidth/dreamwidth] b34ffa: Fix jbackup cookie lost on redirect to www subdomain
2026-Feb-26, Thursday 20:05Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: b34ffa15c1ddbf033ec3bdd48681425046ee8201 https://github.com/dreamwidth/dreamwidth/commit/b34ffa15c1ddbf033ec3bdd48681425046ee8201 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-26 (Thu, 26 Feb 2026)
Changed paths: M src/jbackup/jbackup.pl
Log Message:
Fix jbackup cookie lost on redirect to www subdomain
LWP::UserAgent drops manually-set Cookie headers when following redirects (e.g. dreamwidth.org -> www.dreamwidth.org). Use a proper cookie jar so the ljsession cookie survives redirects.
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] dcb3df: Remove bogus task file
2026-Feb-25, Wednesday 22:54Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: dcb3dfdd7b9e4b01f62b7546589f33945ab51fe7 https://github.com/dreamwidth/dreamwidth/commit/dcb3dfdd7b9e4b01f62b7546589f33945ab51fe7 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-25 (Wed, 25 Feb 2026)
Changed paths: R .github/workflows/tasks/worker-import-eraser: idle-service.json
Log Message:
Remove bogus task file
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] d00724: Move LJ::Protocol::xmlrpc_method out of Apache/Liv...
2026-Feb-25, Wednesday 20:39Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: d00724c9d10284c57382e88b10c6c16f94b04c30 https://github.com/dreamwidth/dreamwidth/commit/d00724c9d10284c57382e88b10c6c16f94b04c30 Author: Mark Smith mark@qq.is Date: 2026-02-25 (Wed, 25 Feb 2026)
Changed paths: M cgi-bin/Apache/LiveJournal.pm M cgi-bin/LJ/Protocol.pm M t/plack-request.t
Log Message:
Move LJ::Protocol::xmlrpc_method out of Apache/LiveJournal.pm
xmlrpc_method was defined in a package LJ::Protocol block at the
bottom of Apache/LiveJournal.pm, which is never loaded under Plack.
Move it into LJ/Protocol.pm so XMLRPC works under both servers.
The test now verifies the full getchallenge round-trip: transport layer works, response is not a SOAP fault, and the expected fields are present.
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] 4c1ff8: Run tidyall with 10 parallel workers
2026-Feb-25, Wednesday 20:21Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 4c1ff815597e0ee4b0fbdcc9b18c44a6ad46da86 https://github.com/dreamwidth/dreamwidth/commit/4c1ff815597e0ee4b0fbdcc9b18c44a6ad46da86 Author: Mark Smith mark@qq.is Date: 2026-02-25 (Wed, 25 Feb 2026)
Changed paths: M bin/tidyall M cgi-bin/DW/Controller/Inbox.pm M doc/dependencies-cpanm M t/02-tidy.t
Log Message:
Run tidyall with 10 parallel workers
Add -j 10 to both the bin/tidyall wrapper and the t/02-tidy.t test to parallelize Perl::Tidy checks across 10 forked workers. Also adds Parallel::ForkManager to dependencies-cpanm and picks up a tidyall formatting fix in DW::Controller::Inbox.
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] f5b688: define inbox view and cur_folder consistently for ...
2026-Feb-25, Wednesday 20:05Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: f5b688f23afc0f4fd15e380e560941a5489b6a39 https://github.com/dreamwidth/dreamwidth/commit/f5b688f23afc0f4fd15e380e560941a5489b6a39 Author: alierak alierak@gmail.com Date: 2026-02-25 (Wed, 25 Feb 2026)
Changed paths: M cgi-bin/DW/Controller/Inbox.pm M htdocs/inbox/index.bml
Log Message:
define inbox view and cur_folder consistently for mark read / delete all actions (#3526)
Co-authored-by: Mark Smith mark@dreamwidth.org
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] 17fb5f: Add support for @mentions and [Unknown site tag] mentions for ...
2026-Feb-25, Wednesday 19:43Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 17fb5f6dc0f31248f64f5eb0d12b61c239f9bb47 https://github.com/dreamwidth/dreamwidth/commit/17fb5f6dc0f31248f64f5eb0d12b61c239f9bb47 Author: Joshua Barrett jjbarr@ptnote.dev Date: 2026-02-25 (Wed, 25 Feb 2026)
Changed paths: M cgi-bin/DW/External/Site.pm A cgi-bin/DW/External/Site/Atproto.pm A cgi-bin/DW/External/Site/Bluesky.pm A cgi-bin/DW/External/Site/BlueskySocial.pm M cgi-bin/LJ/CleanHTML.pm M t/cleaner-markdown.t
Log Message:
Add support for
mentions and [Unknown site tag] mentions for bluesky. (#3524)
- Add support for
mentions and [Unknown site tag] mentions for bluesky.
Bluesky usernames are FQDNs, and prior to now the [Bad username or site: user @ site] syntax has
used the first dot to indicate where the username ends. Since this won't
work for services where the username is the domain name, a special case
has been introduced: if the final dotted segment in an
mention is
shorthand for an atproto-based site, everything else is assumed to be a
username. This does introduce an irregularity:
user
works to reference the bluesky user
user, but
user does NOT. This is done to prevent the mention
as a whole from being a valid domain name (and because future atproto
sites may eventually allow usernames that make such constructs
ambiguous).
In addition to "bsky.app" and the "bsky" shorthand being added,
"bsky.social" has been added to make referencing users with the default
domain bluesky uses easier. An "Atproto" site,
DW::External::Site::Atproto, as also been added as a place to store
common code. It is complete and links to an "account overview" page
listing services associated with the account, but has not yet been
exposed to users.
At present, bluesky accounts are linked to by username, not be DID. This may be subject to future change.
CODE TOUR: It's now possible to reference bluesky accounts with
@mentions! @username.bsky.social works the way you would expect.
If a user has a custom username, you can suffix it with .bsky to make
the link work (eg, @user.example.com.bsky). <user> tags also work
as you would expect (<user name=user.bsky.social site=bsky.app>,
<user name=user site=bsky.social>, and
<user name=user.example.com site=bsky.app> all do what you expect).
- https and minor nit fixes
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] bf0a8e: Add missing headers_in and status_line methods to ...
2026-Feb-25, Wednesday 19:43Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: bf0a8ec11e23acda60dfc8dc68d9fca2ca753c77 https://github.com/dreamwidth/dreamwidth/commit/bf0a8ec11e23acda60dfc8dc68d9fca2ca753c77 Author: Mark Smith mark@qq.is Date: 2026-02-25 (Wed, 25 Feb 2026)
Changed paths: M cgi-bin/DW/Request/Plack.pm A t/plack-request.t
Log Message:
Add missing headers_in and status_line methods to DW::Request::Plack
DW::Request::Plack was missing headers_in() and status_line(), which are implemented by both DW::Request::Apache2 and DW::Request::Standard. This caused XMLRPCTransport to crash under Plack with "Can't locate object method 'headers_in'". Also adds a comprehensive test suite for DW::Request::Plack covering all methods in the module.
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
AI and Dreamwidth
2026-Feb-25, Wednesday 12:11We've seen some questions lately about AI and how it relates to Dreamwidth, especially around scraping and training. Rather than answer piecemeal, I wanted to talk through how
denise and I are thinking about this and try to be explicit about some things.
Dreamwidth is a user-supported service. We don't build the service around monetizing user data, and that informs how we approach AI just like it informs everything else we do.
Your content and AI training
Dreamwidth does not and will not sell, license, or otherwise provide user content for AI training. We have not and will not enter into data-access agreements for AI training purposes.
We will continue taking reasonable technical steps to discourage large-scale automated scraping, including known AI crawlers, where it is practical to do so. No public website can prevent scraping with absolute certainty, but we will keep doing what we reasonably can on our side.
AI features on Dreamwidth
Dreamwidth will not introduce AI features (and we have no current intention of doing so) that use or process user content without a public discussion with the community first.
We're only phrasing it like this because we can't predict the future and who knows what will be possible and available in five or ten years, but right now there's nothing we can see wanting to add.
If that ever changed, the conversation would happen openly before any decisions were made.
Site admin uses of AI
Keeping Dreamwidth usable means dealing with things like spam and abuse, and that sometimes requires automated admin tools to be more efficient or effective.
We are not currently using AI-driven systems for moderation or similar decisions.
If we ever decide that an AI-based tool would help address a site admin problem like spam, we will explain what we are doing and how it works (and ask for feedback!) before putting it into use. Any such tools would exist only to make it easier and more efficient for us to do the work of running the site.
AI and code contributions
Dreamwidth is an open-source project, and contributors use a variety of tools and workflows.
Contributors may choose whether or not to use AI-assisted tools when writing or reviewing code. Dreamwidth will not require contributors to use AI tools, and we will not reject contributions solely because AI-assisted tools were used.
For developers: if you use any AI-assisted development tools for generating a pull request or code contribution, we expect you to thoroughly and carefully review the output of those tools before including them in a pull request. We would ask the community not to submit pull requests from automated agents with no human intervention in the submission process.
I think it's important and I want to be able to review, understand, and maintain any contributions effectively, and that means humans are involved and making sure we're writing code for humans to work with, even if AI was involved.
Important note: this applies to code only. We expect any submitted images or artwork (such as for styles, mood themes, or anything else) to be the work of a human artist.
And to be very explicit, any AI-assisted development does not involve access to Dreamwidth posts or personal content.
In short summary
- Dreamwidth does not and will not provide user content for AI training
- Dreamwidth have not and will not enter data-sharing agreements for AI training and we will do what we can to prevent/discourage automated scraping by AI companies
- Dreamwidth will not introduce AI features without a public discussion first
- Any site admin use of AI tools will be explained openly and part of a public conversation
- Contributors can choose their own development tools for code, but we do not accept images or artwork generated by AI
Oh, and we'll probably mention this (or a subset of this that isn't code related) in an upcoming
dw_news post, but will defer to
denise on that!
Code Tour: 2024-12-01 to 2026-02-25
2026-Feb-25, Wednesday 00:22Let's dive in, shall we?
( Your code tour, with some attempts at arrangement by topic. )
There we go! Another year's worth of code commits, issues resolved, and attempts to make Dreamwidth a greater and cooler place to be. And to have it continue working into the future.
(We should do these more often, but volunteers and, well…*gestures broadly around*. So it may be a while before someone has the spoons to do this again, but we're always trying to be more consistent about it.)
Here are the totals for this code tour:
104 total issues resolved.
Contributors in this code tour:
Pretty mandelbrot pictures using awk - a language that has no graphics commands
2026-Feb-25, Wednesday 16:37
x = 0.3798053
y = 0.09999955
side = .0000002
hue = 0.005

x = 0.3798053523334
y = 0.0999995944562
side = 0.000000000005
hue = 0.0035
The x and y coordinates are the position of the middle of the image. The side is the size of the vertical side of the image in the mandelbrot set. And hue is really a measurement of the spread of colors over the values in the image.
When I've eliminated the main bugs in the server I'll upload the program so anybody can use it from any computer language, regardless of whether the language has graphics commands.
I should have added the mandelbrot set using awk. Here it is (I've highlighted in red the special commands sent to the canvas server via its pixel bridge):
#!/bin/bash
wide=$(awk '/width/ {print $2}' ~/.config/canvas/settings)
high=$(awk '/height/ {print $2}' ~/.config/canvas/settings)
awk -v w="$wide" -v h="$high" '
BEGIN {
hue_scale = 0.0035
saturation = 0.9
lightness = 0.5
max = 10000 # iterations
side = 0.000000000005 # size of image side (smaller = deeper zoom)
midx = 0.3798053523334 # Center X (bigger = move camera right)
midy = 0.0999995944562 # Center Y (bigger = move camera down)
# X image size scales by aspect ratio to match Y size
xside = side * w / h
for (py = 0; py < h; py++) {
y0 = (py - h/2) * side / h + midy
for (px = 0; px < w; px++) {
x0 = (px - w/2) * xside / w + midx
x = 0; y = 0; iter = 0
while (iter < max) {
zx = x * x
zy = y * y
if (zx + zy > 4) break
xtemp = zx - zy + x0
y = 2 * x * y + y0
x = xtemp
iter++
}
# Color
if (iter >= max) {
print "pset " px, py, "(0 0 0)"
} else {
log_z = log(zx + zy) / 2
smooth_n = iter + 1 - log(log_z) / log(2)
hue = (smooth_n * hue_scale) % 1.0
hsl_to_rgb(hue, saturation, lightness)
print "pset " px, py, "(" _r, _g, _b ")"
}
}
if (py % 10 == 0) print "flush"
}
print "flush"
}
function hsl_to_rgb(h, s, l, q, p) {
h = h - int(h)
if (s == 0) {
_r = _g = _b = int(l * 255)
return
}
q = (l < 0.5) ? (l * (1 + s)) : (l + s - l * s)
p = 2 * l - q
_r = int(hue_helper(p, q, h + 1/3) * 255)
_g = int(hue_helper(p, q, h) * 255)
_b = int(hue_helper(p, q, h - 1/3) * 255)
}
function hue_helper(p, q, t) {
if (t < 0) t += 1
if (t > 1) t -= 1
if (t < 1/6) return p + (q - p) * 6 * t
if (t < 1/2) return q
if (t < 2/3) return p + (q - p) * (2/3 - t) * 6
return p
}
' | ./candraw
nsnotifyd-2.4 released
2026-Feb-24, Tuesday 20:16https://dotat.at/@/2026-02-24-nsnotifyd-2-4-released.html
The nsnotifyd daemon monitors a set of DNS zones and
runs a command when any of them change. It listens for DNS NOTIFY
messages so it can respond to changes promptly. It also uses each
zone's SOA refresh and retry parameters to poll for updates if
nsnotifyd does not receive NOTIFY messages more frequently. It comes
with a client program nsnotify for sending notify messages.
This nsnotifyd-2.4 release includes a new feature and
some bug fixes:
The new
-Soption tellsnsnotifydto send all SOA queries to a specific server.Previously, in response to a NOTIFY message, it would send a SOA query back to the source of the NOTIFY, as specified by RFC 1996.
(Typically, a NOTIFY will only be accepted from a known authoritative server for the zone. The target of the NOTIFY responds with a SOA refresh query and zone transfer. But it should avoid trying to refresh from one of the other authoritative servers which might not have received the latest version of the zone.)
Mark Felder encountered a situation where it would have been more convenient to fix the address that
nsnotifydsends SOA queries to, because the source of the NOTIFY messages wasn't responding on that address.Since
nsnotifydis intended to work as glue between disparate parts of a system, it makes sense for it to work around awkward interoperability problems.The
nsnotifyclient program was broken and unable to create NOTIFY messages. D'oh!I have adjusted the release process so that it works better with
git archiveand web front-ends that offer tarball downloads.
Birdfeeding
2026-Feb-24, Tuesday 00:30Community resources include posts about birding events, nurseries that sell seeds or plants attractive to birds, bird identification apps, the benefits of birdwatching, and other useful materials. Check out the anchor posts from Three Weeks for Dreamwidth.
Recent posts:
Sighting a Siberian Superstar: Local birder secures rare red-flanked bluetail for life list
Homes for Birds Week
Photos: House Yard and South Lot
Photos: Flowerbeds
Bird blizzard
[dreamwidth/dreamwidth] f27c47: Convert miscellaneous Talk pages to TT (#3497)
2026-Feb-22, Sunday 19:32Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: f27c478d43d0c489b0252e384b0927475a31eda7 https://github.com/dreamwidth/dreamwidth/commit/f27c478d43d0c489b0252e384b0927475a31eda7 Author: momijizukamori momijizukamori+bugzilla@gmail.com Date: 2026-02-22 (Sun, 22 Feb 2026)
Changed paths: M bin/upgrading/en.dat M cgi-bin/DW/Controller/Talk.pm M cgi-bin/LJ/Global/Defaults.pm R htdocs/delcomment.bml R htdocs/delcomment.bml.text M htdocs/js/commentmanage.js M htdocs/js/jquery.commentmanage.js R htdocs/talkmulti.bml R htdocs/talkmulti.bml.text R htdocs/talkscreen.bml R htdocs/talkscreen.bml.text A views/delcomment.tt A views/delcomment.tt.text A views/talkmulti.tt A views/talkmulti.tt.text A views/talkscreen.tt A views/talkscreen.tt.text
Log Message:
Convert miscellaneous Talk pages to TT (#3497)
Convert talkmulti, talkscreen, and delcomment to TT
Clean up text strings
Fix routing and JSON returns
Fix string path
Clean up some minor errors
Routine Colonoscopy Countdown.
2026-Feb-23, Monday 08:46Meal 1. Gluten free rice bubbles and vanilla yoghurt and 2 mugs of white coffee.
On the upside, yesterday was the Perth monthly fountain pen enthusiast meeting, so we sat around and talked, drew, wrote and looked at each others' pretty pens and ink and drank coffee or whatever everyone else was drinking.
Finished reading Network Effect to Rob and Mum last night, and we all started a rewatch of the serial. We'd eaten a delicious Indian takeaway, as a farewell to interesting food for me for 3 days. Mmm Vindaloo.
The Rhythm of Bitterness
2026-Feb-22, Sunday 11:48As a sort of musical juxtaposition, earlier this week I wrote a review on Rocknerd for the most recent album, "Crocodile Promises" by The March Violets. Once a post-punk band from the early 80s, their company could also include groups like The Chameleons, The Comsat Angels, The Sisters of Mercy, Red Lorry Yellow Lorry, etc. However, more recently, they have moved to a more alt-rock sound, which isn't wrong (bands should develop their sound), but it is different. The album positively thunders along and is a deeply emotional collection of songs, of which "Bite the Hand" really stood out to me. On a related note (pun not intended), I have been delving quite deeply in recent days into the older albums by The Comsat Angels with their often spartan instrumentation and bitter and bleak lyrical content.
It is has all rather suited my current mood. Music is a universal language of mood, both in the uplifting and sombre sense. The latter affects me every day; I seriously don't understand how people remain indifferent to the immediate conflicts (e.g., Gaza) or to longer-term downward trends (e.g., the climate). February 18, for what it's worth, was Bramble Cay Melomys Day, a on-going memorial and campaign for the first mammal species driven to extinction by climate change. Yes, I can enjoy music, culture, artistry, and beauty, whilst simultaneously being driven by such events. As a certain J. Cash once wrote, "I'd love to wear a rainbow every day, And tell the world that everything's okay. But I'll try to carry off a little darkness on my back. 'Til things are brighter, I'm the man in black".
[dreamwidth/dreamwidth] 0e57a6: Tidy SubdomainFunction.pm
2026-Feb-21, Saturday 00:52Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 0e57a69f14581a09c64220452225efd10842985d https://github.com/dreamwidth/dreamwidth/commit/0e57a69f14581a09c64220452225efd10842985d Author: Mark Smith mark@dreamwidth.org Date: 2026-02-21 (Sat, 21 Feb 2026)
Changed paths: M cgi-bin/Plack/Middleware/DW/SubdomainFunction.pm
Log Message:
Tidy SubdomainFunction.pm
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] 558458: Handle userpics subdomain in Plack middleware
2026-Feb-20, Friday 23:20Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 558458c9ab5c5548f20b6b380857292cc8350203 https://github.com/dreamwidth/dreamwidth/commit/558458c9ab5c5548f20b6b380857292cc8350203 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-20 (Fri, 20 Feb 2026)
Changed paths: M cgi-bin/Plack/Middleware/DW/Auth.pm M cgi-bin/Plack/Middleware/DW/SubdomainFunction.pm
Log Message:
Handle userpics subdomain in Plack middleware
The 'userpics' SUBDOMAIN_FUNCTION (e.g., v.dreamwidth.org) was not handled by SubdomainFunction middleware, causing userpic URLs to fall through to the Auth middleware which triggered unnecessary domain session cookie bounces. Under Apache, userpic_trans handles these directly without any auth flow.
Rewrite PATH_INFO from /{picid}/{userid} to /userpic/{picid}/{userid} to match DW::Controller::Userpic's route, and skip the domain session bounce since userpics are public images that don't need authentication.
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] 0c0f75: Skip forced captcha on high-comment entries less t...
2026-Feb-20, Friday 22:33Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 0c0f75384cb09c6515b5381d9873105581cad595 https://github.com/dreamwidth/dreamwidth/commit/0c0f75384cb09c6515b5381d9873105581cad595 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-20 (Fri, 20 Feb 2026)
Changed paths: M cgi-bin/LJ/Protocol.pm M cgi-bin/LJ/S2/ReplyPage.pm M cgi-bin/LJ/Talk.pm
Log Message:
Skip forced captcha on high-comment entries less than 30 days old
The 5k-comment captcha threshold was meant to slow bots targeting specific entries, but most spam hits old/abandoned journals while active anon memes are the ones suffering from the forced captcha.
Entries posted within the last 30 days can now receive up to the full 10k comments without a forced captcha. Entries older than 30 days keep the existing 5k threshold. All other captcha triggers (rate limiting, journal settings, spam heuristics) are unchanged.
Also refactors require_captcha_test to accept an LJ::Entry object instead of a bare ditemid, since the entry is already available at all call sites.
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
Commit: e78529d60c5e457534481f350c381821dc5810fd https://github.com/dreamwidth/dreamwidth/commit/e78529d60c5e457534481f350c381821dc5810fd Author: Mark Smith mark@dreamwidth.org Date: 2026-02-20 (Fri, 20 Feb 2026)
Changed paths: M .gitignore
Log Message:
Add .worktrees/ to .gitignore
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
Compare: https://github.com/dreamwidth/dreamwidth/compare/86a23512cf4a...e78529d60c5e
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] 86a235: Add per-entry OpenGraph meta tags for public entri...
2026-Feb-20, Friday 21:49Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 86a23512cf4aca54a77dd38f26348c19a338d83d https://github.com/dreamwidth/dreamwidth/commit/86a23512cf4aca54a77dd38f26348c19a338d83d Author: Nova sda1@umbc.edu Date: 2026-02-20 (Fri, 20 Feb 2026)
Changed paths: M cgi-bin/LJ/S2/EntryPage.pm
Log Message:
Add per-entry OpenGraph meta tags for public entries (#3522)
Emit og:title, og:type, og:url, og:site_name, og:description, og:image, article:published_time, article:author, and article:tag for public journal entries so that Discord, Slack, Facebook, and other services can generate meaningful link previews.
Only public entries get these tags — non-public entries keep the existing site-wide defaults (DW logo) to avoid content leakage. All attribute values are escaped with LJ::ehtml(). The entry OG block is prepended to head_content so the entry-specific og:image takes precedence over the site-wide fallback from Page().
Fixes #2206
Co-authored-by: Novalinium nova@noblejury.com Co-authored-by: Claude Opus 4.6 noreply@anthropic.com
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] 722aca: Fix k shortcut sometimes not scrolling to previous...
2026-Feb-20, Friday 21:32Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 722aca660143d17125cf5f95365e3d8272f5773c https://github.com/dreamwidth/dreamwidth/commit/722aca660143d17125cf5f95365e3d8272f5773c Author: Mark Smith mark@dreamwidth.org Date: 2026-02-20 (Fri, 20 Feb 2026)
Changed paths: M htdocs/js/jquery.shortcuts.nextentry.js
Log Message:
Fix k shortcut sometimes not scrolling to previous entry
prevPageEntry() used a strict < comparison with no tolerance, so if the scroll position landed even 1px past an entry's top (due to sub-pixel rounding or animation overshoot), pressing k would "scroll" to the entry already on screen, appearing to do nothing. Add the same 50px tolerance that nextPageEntry() already uses.
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
An astronomical interlude
2026-Feb-20, Friday 15:41Got some quite good detail with Centaurus A.


Follow Friday 2-20-26
2026-Feb-20, Friday 00:34Here's the plan: every Friday, let's recommend some people and/or communities to follow on Dreamwidth. That's it. No complicated rules, no "pass this on to 7.328 friends or your cat will die".
Stop Royal Mail leaving our letters undelivered !
2026-Feb-18, Wednesday 11:26https://act.38degrees.org.uk/act/royal-mail-letters-eoi
[dreamwidth/dreamwidth] 472e7c: Fix SES worker to expect S3 action notifications
2026-Feb-17, Tuesday 22:13Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 472e7ca0671a6f37896549ef3e935b8cfdd52f03 https://github.com/dreamwidth/dreamwidth/commit/472e7ca0671a6f37896549ef3e935b8cfdd52f03 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-16 (Mon, 16 Feb 2026)
Changed paths: M bin/worker/ses-incoming-email
Log Message:
Fix SES worker to expect S3 action notifications
The SNS notification now comes from the S3 action's topic_arn (terraform change), so receipt.action will always be type S3. Revert the non-S3 skip to a proper error since it would indicate a misconfiguration.
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
Commit: 4895912982e33afbf41b439bc7d38d1a625b25b7 https://github.com/dreamwidth/dreamwidth/commit/4895912982e33afbf41b439bc7d38d1a625b25b7 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-17 (Tue, 17 Feb 2026)
Changed paths: M bin/worker/dw-embeds M cgi-bin/DW/Task.pm M cgi-bin/DW/TaskQueue.pm M cgi-bin/DW/TaskQueue/SQS.pm M t/taskqueue-dedup.t
Log Message:
Add max_retries support to TaskQueue to avoid DLQ pileup
Failed SQS tasks that exceed the receive count threshold are now marked complete instead of being left for the dead letter queue. The SQS layer passes ApproximateReceiveCount through to tasks, and start_work checks it against a configurable max_retries option. Applied to dw-embeds where unreachable remote hosts cause repeated failures that fill the DLQ.
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
Compare: https://github.com/dreamwidth/dreamwidth/compare/6792621c5547...4895912982e3
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
March Meta Matters Challenge 2026 Returning!
2026-Feb-17, Tuesday 16:39
March 1 is just weeks away, so that means the kickoff to this year's March Meta Matters Challenge will be taking place soon! The challenge involves locating and copying over meta you've created to a second site in order to ensure its preservation, plus there will be some prompts for creating new meta.
Feel free to ask questions here about the challenge, locations, etc. Otherwise subscribe to
One page of async Rust
2026-Feb-17, Tuesday 19:42https://dotat.at/@/2026-02-16-async.html
I'm writing a simulation, or rather, I'm procrastinating, and this blog post is the result of me going off on a side-track from the main quest.
The simulation involves a bunch of tasks that go through a series of
steps with delays in between, and each step can affect some shared
state. I want it to run in fake virtual time so that the delays are
just administrative updates to variables without any real
sleep()ing, and I want to ensure that the mutations happen in the
right order.
I thought about doing this by representing each task as an enum
State with a big match state to handle each step. But then I
thought, isn't async supposed to be able to write the enum State and
match state for me? And then I wondered how much the simulation
would be overwhelmed by boilerplate if I wrote it using async.
Rather than digging around for a crate that solves my problem, I thought I would use this as an opportunity to learn a little about lower-level async Rust.
Turns out, if I strip away as much as possible, the boilerplate can fit on one side of a sheet of paper if it is printed at a normal font size. Not too bad!
But I have questions...
I've had a letter from Buckingham Palace
2026-Feb-17, Tuesday 12:03I have had a reply.
Sadly it is marked "Private and Confidential" so I cannot tell you what it said.
I wasn't really hoping for a reply and the King now knows how I feel.
I will just have to hope that he does the right thing.
The only previous time I wrote to the Palace, the Queen was overtaken by events:
Boris resigned whilst I was at the post box !
[dreamwidth/dreamwidth] 679262: Fix log levels in SES incoming email pipeline
2026-Feb-16, Monday 21:32Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 6792621c554719720fc25eba12b4ea612264cb73 https://github.com/dreamwidth/dreamwidth/commit/6792621c554719720fc25eba12b4ea612264cb73 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-16 (Mon, 16 Feb 2026)
Changed paths: M bin/worker/ses-incoming-email M cgi-bin/DW/IncomingEmail.pm
Log Message:
Fix log levels in SES incoming email pipeline
- Skip non-S3 action notifications at info level (expected duplicate from SNS action, not an error)
- Empty email data is warn, not error
- No support category match is info, not error (normal for non-support mail)
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] def63d: Deprecate 18.04 workers
2026-Feb-16, Monday 21:26Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: def63d7f03f190bc1a99d4fd648fa0f1424b6960 https://github.com/dreamwidth/dreamwidth/commit/def63d7f03f190bc1a99d4fd648fa0f1424b6960 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-16 (Mon, 16 Feb 2026)
Changed paths: A .github/workflows/tasks/worker-ses-incoming-email-service.json R .github/workflows/worker-build.yml R .github/workflows/worker-deploy.yml M .github/workflows/worker22-deploy.yml M config/update-workflows.py
Log Message:
Deprecate 18.04 workers
Also add deploy for new ses-incoming-email worker.
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] bba49e: Add SES incoming email worker and shared processin...
2026-Feb-16, Monday 21:17Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: bba49ec2ee390e6882eda0b8004c6c57beacad9e https://github.com/dreamwidth/dreamwidth/commit/bba49ec2ee390e6882eda0b8004c6c57beacad9e Author: Mark Smith mark@dreamwidth.org Date: 2026-02-16 (Mon, 16 Feb 2026)
Changed paths: A bin/worker/ses-incoming-email A cgi-bin/DW/IncomingEmail.pm M cgi-bin/DW/Task/IncomingEmail.pm M config/workers.json A t/incoming-email.t
Log Message:
Add SES incoming email worker and shared processing pipeline
Extract email processing logic from DW::Task::IncomingEmail into DW::IncomingEmail so both the legacy TaskQueue worker and the new SES-based worker share the same pipeline. Remove obsolete spam filtering (subject heuristics, body checks, virus signatures, bounce detection) — SES handles this upstream now.
New components:
- DW::IncomingEmail: shared processing (MIME parsing, hooks,
post-by-email, alias forwarding with From-rewriting, support
routing, multi-domain normalization via
lj::INCOMING_EMAIL_DOMAINS)
- bin/worker/ses-incoming-email: SQS-polling worker that receives
SNS notifications from SES, fetches email from S3, checks SES
spam/virus verdicts, and delegates to DW::IncomingEmail
- t/incoming-email.t: tests for process flow, From-rewriting with
per-sender SHA256 hash, and domain normalization
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] 09b2fa: Add SQS queue names, so we can target autoscaling ...
2026-Feb-16, Monday 10:04Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 09b2fa09012b1edc5f23883029cf12a5a045bcc4 https://github.com/dreamwidth/dreamwidth/commit/09b2fa09012b1edc5f23883029cf12a5a045bcc4 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-16 (Mon, 16 Feb 2026)
Changed paths: M config/workers.json
Log Message:
Add SQS queue names, so we can target autoscaling to queue depth
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] e18e34: Expand CI to run plack, cleaner, and routing tests
2026-Feb-16, Monday 09:44Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: e18e34f910eb489a5d0daa40f93e2024cff9bbc2 https://github.com/dreamwidth/dreamwidth/commit/e18e34f910eb489a5d0daa40f93e2024cff9bbc2 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-16 (Mon, 16 Feb 2026)
Changed paths: M .github/workflows/ci.yml M t/plack-auth.t M t/plack-integration.t M t/plack-media.t M t/plack-subdomain.t M t/plack-sysban.t
Log Message:
Expand CI to run plack, cleaner, and routing tests
Rename the workflow to "CI (fast)" and add plack integration, text cleaner, and routing test steps. Fix pre-existing test failures caused by the rate-limiting middleware interfering with unrelated tests: mock DW::RateLimit, session resolution, sysban, and uniq cookie in tests that don't exercise those concerns. Fix routing mock in sysban and subdomain tests to return 0 (handled) instead of undef (which fell through to BML). Suppress 'used only once' warnings across plack test files.
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] 7f5a36: Fix domain session cookie bounce not firing under ...
2026-Feb-16, Monday 09:16Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 7f5a36ba49391219cb773eeb2ee5248be3b9ac09 https://github.com/dreamwidth/dreamwidth/commit/7f5a36ba49391219cb773eeb2ee5248be3b9ac09 Author: Mark Smith mark@dreamwidth.org Date: 2026-02-16 (Mon, 16 Feb 2026)
Changed paths: M cgi-bin/Plack/Middleware/DW/Auth.pm M t/plack-auth.t
Log Message:
Fix domain session cookie bounce not firing under Plack
When a user's domain session cookie is stale (e.g. after re-login gives them a new session ID), the Plack Auth middleware detected the mismatch and set the bounce URL but never actually redirected. The page would render as logged-out instead of bouncing through /misc/get_domain_session to refresh the cookie.
Add the redirect check to the Auth middleware's else branch so all Plack-served pages (journal views, controllers, etc.) get the bounce. Also fix pre-existing test failures in plack-auth.t where MockUser was missing the userid method needed by the RateLimit middleware.
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications
[dreamwidth/dreamwidth] 2c6ed3: Update some worker knobs for autoscaling
2026-Feb-16, Monday 09:13Branch: refs/heads/main Home: https://github.com/dreamwidth/dreamwidth Commit: 2c6ed3dd318302532b2c0133e45b97cd1c0b8a1d https://github.com/dreamwidth/dreamwidth/commit/2c6ed3dd318302532b2c0133e45b97cd1c0b8a1d Author: Mark Smith mark@dreamwidth.org Date: 2026-02-16 (Mon, 16 Feb 2026)
Changed paths: M config/workers.json
Log Message:
Update some worker knobs for autoscaling
To unsubscribe from these emails, change your notification settings at https://github.com/dreamwidth/dreamwidth/settings/notifications