EPIPE on write might mean you're doing it wrong

Last month, I had an opportunity to dip into a part of the world I don't normally touch: Apache (as in, the web server) and the way it runs PHP code. This might seem ironic to some people since I used to support a colossal amount of PHP-ish code, but that was done with a virtual machine and had long since evolved out of the Apache ecosystem.

Yep, this is about Apache, php-fpm, mod_fastcgi, and all of that other stuff, and it was all new to me. The question was basically: why is this getting plugged up sometimes? The rest of the machine seems fine, so why is this one part going stupid?

There was a lot of random badness I ended up tripping over, but there was one part in particular I wanted to call out for the benefit of anyone who still gives a shit about trying to build this stuff properly. It has to do with being aware of the situation and not smacking yourself in the head with a shovel if you can help it.

In the above regime, a request comes in, and the web server pushes it down a Unix domain socket to a bunch of PHP worker threads which are hanging out in accept(). One of them "wins" and is rewarded with a new file descriptor for the incoming request.

The next thing it does (and this is fine) is to call poll() because it wants to wait until there's some work to be done. It immediately returns, but it has two flags set, not one. It has POLLIN, sure, but it also has POLLHUP which basically means that the far end has already gone away. It doesn't notice this second flag.

What does it do? If you said "it reads the request and runs it anyway, then sends a response to an uncaring socket that has nobody on the other end", you're right. It gets EPIPE on the write, and presumably some other part of the process gets a SIGPIPE, assuming it hasn't squashed them in its signal setup.

Let's say these requests are relatively expensive and take up to 5 seconds to run. Maybe there are 300 of them stuck in the pipe, having already been transmitted by the web server, but both it and the original http client are long gone. The fpm workers are still going to pop each one off in turn, will blow multiple seconds doing the work, and will then reply to nobody in particular.

It'll take at least 1500 worker-seconds for it to dig out from this backlog. If there are 10 workers, well, that's at least 150 seconds of it being completely saturated and thus unable to run PHP stuff for any part of the site which ends up on these workers. Good times.

This is what it looks like when this happens with multiple threads:

1672855 01:09:05.333624 write(5, "\1\6\0\1\0A\7\0Content-type: text/html; charset=UTF-8\r\n\r\nstuff... more stuff...\n\0\0\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\0\0\0", 96) = -1 EPIPE (Broken pipe) <0.000028>
1672853 01:09:05.335072 write(5, "\1\6\0\1\0A\7\0Content-type: text/html; charset=UTF-8\r\n\r\nstuff... more stuff...\n\0\0\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\0\0\0", 96) = -1 EPIPE (Broken pipe) <0.000027>
1672854 01:09:06.307556 write(5, "\1\6\0\1\0A\7\0Content-type: text/html; charset=UTF-8\r\n\r\nstuff... more stuff...\n\0\0\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\0\0\0", 96) = -1 EPIPE (Broken pipe) <0.000028>

That's my dumb little test script which prints "stuff... more stuff..." being run by the fpm worker and finding out that the requester is gone. This was many minutes after I stopped sending new requests.

This is how you get a system that will stay sick long after the crushing load of requests has gone away. Again, it could have known this at the very beginning...

01:20:36.514261 poll([{fd=5, events=POLLIN}], 1, 5000) = 1 ([{fd=5, revents=POLLIN|POLLHUP}]) <0.000016>

It's right there! POLLHUP! It's gone! The poll loop in question is itself buried maybe six or seven levels deep in a massively nested set of while loops, if-this, if-that, etc, and amounts to this:

do {
  errno = 0;
  ret = poll(&fds, 1, 5000);
} while (ret < 0 && errno == EINTR);

if (ret > 0 && (fds.revents & POLLIN)) {
  break;
}

It just sits there in poll for 5 seconds, ignoring the usual worse-is-better EINTR stuff, until poll says something is ready to rock or it gets a "real" error, or it times out.

But if poll said something went active and POLLIN is set, then it breaks out of whatever "while (1)" loop it's in (seriously), and carries on to where it reads from the socket and fires up the parser and runs some script with the parameters. That's what you'd expect.

I wondered what it would do if I forced it to abort any request where POLLHUP was set on the client fd. It should just drop straight through and clean up the mess relatively quickly, and sure enough, it did:

3756041 04:09:59.049764 poll([{fd=5, events=POLLIN}], 1, 5000) = 1 ([{fd=5, revents=POLLIN|POLLHUP}]) <0.000016>
3756041 04:09:59.049827 close(5)        = 0 <0.000024>
3756041 04:09:59.049888 accept(10, {sa_family=AF_UNIX}, [112 => 2]) = 5 <0.000030>
3756041 04:09:59.049972 fcntl(5, F_GETFD) = 0 <0.000013>
3756041 04:09:59.050021 fcntl(5, F_SETFD, FD_CLOEXEC) = 0 <0.000013>
3756041 04:09:59.050070 poll([{fd=5, events=POLLIN}], 1, 5000) = 1 ([{fd=5, revents=POLLIN|POLLHUP}]) <0.000015>
3756041 04:09:59.050130 close(5)        = 0 <0.000023>
3756041 04:09:59.050190 accept(10, {sa_family=AF_UNIX}, [112 => 2]) = 5 <0.000019>
3756041 04:09:59.050251 fcntl(5, F_GETFD) = 0 <0.000013>
3756041 04:09:59.050300 fcntl(5, F_SETFD, FD_CLOEXEC) = 0 <0.000013>
3756041 04:09:59.050349 poll([{fd=5, events=POLLIN}], 1, 5000) = 1 ([{fd=5, revents=POLLIN|POLLHUP}]) <0.000014>
3756041 04:09:59.050407 close(5)        = 0 <0.000021>
3756041 04:09:59.050465 accept(10, {sa_family=AF_UNIX}, [112 => 2]) = 5 <0.000019>
3756041 04:09:59.050523 fcntl(5, F_GETFD) = 0 <0.000024>
3756041 04:09:59.050579 fcntl(5, F_SETFD, FD_CLOEXEC) = 0 <0.000007>
3756041 04:09:59.050616 poll([{fd=5, events=POLLIN}], 1, 5000) = 1 ([{fd=5, revents=POLLIN|POLLHUP}]) <0.000011>

Just... bonk, bonk, bonk, bonk. The first worker that wakes up ends up stripping all of these useless requests from the queue. It doesn't spend any time reading them, never mind parsing them, and it definitely doesn't try running any PHP code. It just closes the fd and goes back to waiting for another connection.

It managed to destroy a backlog of a few thousand dead requests in under a second. By not wasting time on those things, it became available to handle the real requests from the clients who were still connected to the web server right then.

Now, is this a universal solution? Probably not. There are plenty of async situations where you'll get POLLHUP and you still need to read until EOF because you care about consuming whatever data managed to make it down the chute before the far end hung up. Case in point: do the fork, dup2, exec thing to run a subprocess and watch the fds for stdout and stderr from the child process. poll will totally see POLLHUP once it's done, but you have to stick around to consume the rest of it. You did want the actual output from the process, right?

But, if you're talking about individual webshit requests that are probably going to be retried anyway and which don't need to be executed "at any cost" because there's nothing unique or special about them, you could probably stand to slough off the load up front.

Keycloak 26.7.0 released

To download the release go to Keycloak downloads.

Highlights

This release features new capabilities for users and administrators of Keycloak. The highlights of this release are:

  • Automate user provisioning with the SCIM API (preview)

  • Simplified multi-cluster high availability without external caches (preview)

  • Enhanced reverse proxy guides with blueprints for HAProxy and Traefik

  • Step-up authentication for SAML clients

Read on to learn more about each new feature. If you are upgrading from a previous release, also review the changes listed in the upgrading guide.

Security and Standards

Stronger security for the Identity Brokering API

The Identity Brokering API allows applications to retrieve tokens obtained from external identity providers during federated login. Version 2 of this API replaces the legacy V1 with a more secure and standards-compliant design:

  • Client-level authorization — access to external tokens is controlled per client using dedicated settings (Allow retrieve external tokens and an identity provider allow list) instead of assigning broker roles to individual users.

  • Confidential clients only — public clients are rejected, ensuring that only authenticated clients can retrieve external tokens.

  • OAuth 2.0 compliant — the endpoint uses POST and returns standard JSON responses with access_token, error, and error_description fields.

  • Session-based token storage — a new Store token in session option keeps tokens in the user session for faster access, with automatic cleanup on session expiry. Database storage remains available for persistence across sessions.

V2 is now supported but disabled by default. V1 is deprecated but still enabled by default for backward compatibility. In a future release, V1 will be removed and V2 will become the default.

For more information, see the Identity Brokering APIs chapter in the Server Developer Guide.

Progress on Verifiable Credentials (OID4VCI) (experimental)

Verifiable Credentials (OID4VCI) allow organizations to issue tamper-proof, cryptographically signed credentials — such as employee badges, academic diplomas, or professional certifications — that users can store in a digital wallet and present to third parties without involving the issuer.

OID4VCI remains an experimental feature in Keycloak, but this release brings substantial improvements from both the core team and the community:

  • Polishing of existing functionality and improving configuration. Everything is now configurable in the admin UI in addition to the admin REST API.

  • Lots of bugs fixed. Improved specification compliance.

  • Conformance with the OpenID4VC High Assurance Interoperability Profile (HAIP). This work involves the introduction of the dedicated Keycloak experimental feature client-auth-abca for Attestation based client authentication (ABCA).

  • Management of verifiable credentials for individual users. This involves the ability for an administrator to create a verifiable credential for a user to indicate that this user can retrieve a verifiable credential, as well as the ability for users to start issuance of a verifiable credential from the Keycloak account console.

  • Pre-authorized code grant support is still experimental and was moved to the dedicated experimental feature oid4vc-vci-preauth-code

  • Support for credential refresh interval. Administrators can now configure a separate refresh interval (vc.refresh_interval_in_seconds) in the client scope settings that controls how often wallets must refresh the credential, independent of the credential lifetime. When not explicitly set, defaults to 7 days or the credential lifetime, whichever is smaller. This enables regular credential rotation for enhanced security while maintaining user convenience through automatic refresh using the refresh token. For more information, see the Create Client Scopes with Mappers section in the OID4VCI configuration guide.

  • Documentation updated and improved

Cross-domain token exchange with Identity Assertion JWT Grant (experimental)

When two organizations each run their own authorization server, users often need to re-authenticate when crossing between them — even though their identity was already verified. The Identity Assertion JWT Authorization Grant (ID-JAG) solves this by allowing one authorization server to present a signed identity assertion to another, which then issues an access token without requiring the user to log in again.

Keycloak provides partial experimental support for the Identity Assertion JWT Authorization Grant. It currently implements only the receiving authorization server role, accepting ID-JAG assertions at the token endpoint and issuing access tokens in return. Other parts of the ID-JAG specification are not yet implemented, so the complete flow is not currently supported.

To try it out, start Keycloak with the feature identity-assertion-jwt enabled.

Many thanks to Yutaka Obuchi for the contribution of this feature!

Automate user provisioning with the SCIM API (preview)

SCIM (System for Cross-domain Identity Management) is a standard protocol for reading and writing identity resources such as users and groups across multiple systems. It enables organizations to automate user provisioning and deprovisioning using widely available tooling — for example, integrating with identity governance platforms, HR systems, or other identity providers.

Keycloak has SCIM APIs for managing users and groups within a realm. The implementation covers full CRUD and PATCH operations, filtering and pagination, schema extensions including the Enterprise User extension, and schema discovery endpoints.

In this release, the SCIM API is being promoted to a preview feature. In the default profile it is disabled by default; to try it out, enable the scim-api feature.

For more details, see the Managing users and groups through SCIM documentation.

Real-time security signals to downstream applications (experimental)

When a user logs out, changes credentials, or gets disabled in Keycloak, downstream applications typically don’t learn about it until the next token refresh — leaving a window where stale sessions remain active. The OpenID Shared Signals Framework (SSF) closes this gap by letting identity providers push security events to relying parties in near real time.

Keycloak can now act as an SSF Transmitter, delivering signed Security Event Tokens (SETs) to registered receivers. It supports CAEP 1.0 and RISC 1.0 event profiles with both push (RFC 8935) and poll (RFC 8936) delivery methods. Events are persisted to a durable outbox so that no signal is lost across restarts, and a cluster-aware background drainer handles retries and exponential backoff. Each realm can opt in individually, and streams, subjects, and event types are managed through the admin console and REST API.

To enable SSF, start Keycloak with the feature ssf enabled.

For more details, see the Shared Signals Framework guide.

Standardized authorization decisions with AuthZen (experimental)

Applications that need fine-grained authorization typically call Keycloak’s proprietary authorization API, coupling them to its internal model. The OpenID AuthZEN Authorization API 1.0 defines a vendor-neutral protocol between Policy Decision Points (PDPs) and Policy Enforcement Points (PEPs), enabling applications to request authorization decisions through a standard interface.

Keycloak now implements the AuthZEN Evaluation API as a PDP. Applications send evaluation requests describing a subject, resource, and action, and Keycloak returns a permit or deny decision based on its configured authorization policies. Both single and batch evaluation endpoints are available.

To enable AuthZen, start Keycloak with the feature authzen enabled.

For more details, see the AuthZen Authorization guide.

Authorize AI tools and MCP servers

The Model Context Protocol (MCP) is becoming the standard way for AI applications to connect to external tools and data sources. As MCP adoption grows, securing these connections with proper OAuth 2.0 authorization is critical.

Keycloak continues to improve its MCP authorization server capabilities. This release adds integration documentation for Claude Code as an MCP client, alongside the existing Visual Studio Code integration. Both use OAuth Client ID Metadata Document (CIMD) for dynamic client registration with PKCE-secured public client flows and localhost callbacks.

For setup instructions, see the Integrating with Model Context Protocol (MCP) guide.

Delegate access across services with Token Exchange Delegation (experimental)

In multi-service architectures, a backend service sometimes needs to act on behalf of a user at another service — for example, when a gateway delegates work to a downstream API. Standard Token Exchange handles client-to-client token swaps, but verifying that the requester is authorized to impersonate a specific user requires additional checks.

Keycloak introduces token exchange delegation as an experimental feature. It adds a new delegation parameterized scope type that validates whether the requesting user is authorized to act on behalf of the target user before the exchange is granted. The delegation scope requires user consent and is automatically reassessed on token refresh, so revoked impersonation rights take effect immediately.

To enable token exchange delegation, start Keycloak with the feature token-exchange-delegation enabled.

Step-up authentication for SAML clients

Step-up authentication allows applications to require a stronger level of authentication for sensitive operations. Previously, this capability was only available for OpenID Connect clients.

Keycloak now extends step-up authentication to the SAML protocol, enabling SAML service providers to request a specific authentication context class in their authentication requests. The feature step-up-authentication-saml has been promoted from preview to supported in this release.

For more information, see the Server Administration Guide.

Administration

Declarative client management with Admin API v2 (experimental)

Keycloak introduces a new REST API for managing OIDC and SAML clients. The new API provides strict validation, support for declarative configuration, and an accurate OpenAPI specification that enables reliable client generation. This addresses long-standing limitations of the original Admin REST API. This is the first resource in the Admin API v2, with additional resources to follow in future releases.

The API can be consumed through a Java client, an auto-generated JavaScript client, and a CLI. The Keycloak Operator uses it to manage clients declaratively via KeycloakOIDCClient and KeycloakSAMLClient custom resources.

Enabling this feature also enables the OpenAPI specification endpoint on the management interface, which the CLI uses to adapt its commands to the connected server version.

To try it out, enable the client-admin-api:v2 feature.

For more details, see the Admin API v2 guide and the Managing Keycloak Clients operator guide. Feedback is welcome in the Client Admin API v2 GitHub Discussion.

Thanks to Robin Meese for contributing the OpenAPI endpoint on the management interface and the Java admin client, and to Sebastian Schuster for his participation in the Admin API working group and the Go client analysis.

Fine-grained delegation for organization administration

Managing organizations in Keycloak previously required the manage-realm role — a high-privilege role that grants far more access than most organization administrators need. This release introduces dedicated admin roles and Fine-Grained Admin Permissions for organizations, allowing administrators to delegate organization management without over-provisioning access.

New realm admin roles provide coarse-grained delegation:

  • manage-organizations — grants full read and write access to organizations, including creating, updating, and deleting organizations and their members.

  • view-organizations — grants read-only access to organizations and their members (also requires view-users or Fine-Grained Admin Permissions for user visibility).

  • query-organizations — grants the ability to search and list organizations without full view access, consistent with the query-users / query-clients / query-groups pattern.

The manage-realm role continues to implicitly grant full organization management access for backward compatibility.

For per-organization granularity, organizations are now a first-class resource type in Fine-Grained Admin Permissions. Administrators can create permissions to control which specific organizations a delegated administrator can view or manage — for example, granting access to manage one organization without giving access to all organizations in the realm. When Fine-Grained Admin Permissions is enabled, organization member queries also respect user-level permissions, returning only members the administrator is permitted to view.

Automatic role inheritance through organization groups

Assigning roles to individual organization members does not scale well when an organization has hundreds of users who all need the same permissions. Organization groups now support realm and client role assignments, so administrators can assign a role once to the organization group and have it automatically appear in realm_access and resource_access token claims for all group members.

Additionally, the Organization Group Membership protocol mapper (OIDC and SAML) can include these roles within the organization claim, organized per organization, by enabling the Add group role mappings configuration option.

For more details, see the Managing organization groups guide.

Better passkey compatibility with new WebAuthn policy options

Passkeys let users sign in with biometrics or a security key instead of a password. To work correctly, the server must tell the browser whether it prefers a discoverable credential (a passkey stored on the device) or not — and the previous Yes/No option could not express the increasingly common preferred value.

The WebAuthn Policy and WebAuthn Passwordless Policy now provide a Discoverable credential option that follows the current WebAuthn specification, supporting required, preferred, and discouraged values. This improves compatibility with passkey providers such as iCloud Keychain, Google Password Manager, and 1Password. The previous Require Discoverable Credential option is now deprecated and planned for removal in a future release.

Administrators often give realms short technical names (like acme-prod) but set a human-readable display name (like Acme Corporation). Previously, the admin console search only matched against the technical realm name, making it harder to find realms in large multi-tenant deployments.

Realm search now matches against the display name in addition to the realm name, so administrators can find realms by whichever name they remember.

Type-safe validation for parameterized scopes (experimental)

Parameterized scopes allow OAuth clients to request context-specific access — for example, project:12345 to request access to a particular project, or account:savings to scope a token to a specific bank account. Previously, the parameter value was validated only by an optional regex, making it easy to pass invalid or unexpected values.

Parameterized scopes can now define a parameter type that validates the captured value at request time. Built-in types include string, integer, boolean, username, and custom (validated against an admin-defined regex). The type is required when creating parameterized scopes with the feature enabled, ensuring that tokens always carry well-formed scope parameters.

For more details, see the Upgrading Guide.

Additional datasources may be excluded from health checks

When using multiple datasources, a failing non-critical datasource can cause the health check endpoint to report the entire deployment as unhealthy. Individual datasources can now be excluded from health checks, so optional or secondary datasources do not trigger unnecessary alerts or affect load balancer routing.

Read more about it in the Configure multiple datasources guide.

Configuring and Running

Enhanced reverse proxy guides with blueprints for HAProxy and Traefik

Running Keycloak in production requires a reverse proxy, but configuring TLS termination, certificate forwarding, and admin API security correctly across different proxies is error-prone.

The reverse proxy documentation has been significantly expanded with dedicated step-by-step guides for HAProxy and Traefik covering both TLS passthrough and re-encrypt modes, and also explain the concepts so they can be applied for other proxies as well.

For more details, see the Using a reverse proxy guide.

Simplified multi-cluster high availability without external caches (preview)

The existing multi-cluster setup for Keycloak requires deploying and managing an external Infinispan cluster for cross-site session replication, along with vendor-specific fencing infrastructure for automated failover. This adds significant operational complexity and limits deployments to specific environments.

Multi-cluster v2 removes the external Infinispan requirement entirely. Keycloak instances connect directly to each other using embedded Infinispan caches and rely on the synchronously replicated database as the single source of truth. Cache invalidation across sites is handled through a database-backed outbox pattern. The load balancer can detect the downtime of a site without requiring external fencing infrastructure.

To enable this setup, start Keycloak with the feature stateless. For architecture details and a deployment blueprint, see the Multi-cluster deployments (v2) guide.

Keycloak Operator kustomize installation

Installing the Keycloak Operator on vanilla Kubernetes clusters previously required downloading and applying individual manifest files, making upgrades and customization harder to manage. The Operator can now be installed using kustomize, providing a declarative and reproducible installation method.

For installation instructions, see the Operator Guide.

Cluster-wide install mode for the Keycloak Operator (preview)

Organizations running multiple Keycloak instances across different Kubernetes namespaces previously needed to install a separate Operator in each namespace. The Keycloak Operator now exposes AllNamespaces as a supported OLM install mode, allowing a single Operator instance to reconcile Keycloak custom resources across all namespaces in the cluster. For non-OLM installations, cluster-wide deployment is available through the cluster-wide kustomization overlay.

Cluster-wide installation is in preview. For installation instructions and limitations, see the Operator Guide.

Upgrading

Before upgrading refer to the migration guide for a complete list of changes.

All resolved issues

Security fixes

Weaknesses

Removed features

New features

Enhancements

Bugs

Connection Allowlist: a network firewall, built into the browser

By Scott Helme

Connection Allowlist is a new browser security mechanism that lets a document declare, up front, the exact set of destinations it's permitted to open network connections to. Anything not on the list is blocked by the browser before the connection leaves the machine. It's currently a

Weekly Update 511: Live from my Riad in Marrakech

By Troy Hunt

Presently sponsored by: Report URI: Guarding you from rogue JavaScript! Don’t get pwned; get real-time alerts & prevent breaches #SecureYourSite

How's this for a location?! I mean, last week was nice with Scott in Mallorca, but Marrakech is, well, wow 😮 Anyway, about those data breaches... This week I'm talking about the futility of attempting to remove piss from a pool, yet here we are, with

Airport Meeting

Although it was a setback for physics, I'm glad the particle naming rights issue led to the cancelation of Pizza Hut's Superconducting Super Collider in the early 90s, so the Double Stuffed Extra Cheese Topping Quark ended up just being named 'top quark.'

Offside

The arbiter gave my knight a red card for capturing with cleats up :(

Human support requires human queries

By pdw

We are committed to providing support delivered by real humans. We know how frustrating it can be to have to fight your way past chatbots and virtual assistants that can’t help you in order to get to a human that can. In fact, when you contact us, your message will be dealt with not only […]

Swimming Pools, Pee, and Trying to Delete Your Data From the Internet

By Troy Hunt

Presently sponsored by: Report URI: Guarding you from rogue JavaScript! Don’t get pwned; get real-time alerts & prevent breaches #SecureYourSite

I can't recall if someone else originally came up with this saying or if I said it in some off-the-cuff comment and it just propagated, but since it's often attributed back to me, I'll relay it here regardless:

Trying to delete yourself

Types of Tornado Alert

I hate the unearthly sound my phone makes when the weather service issues a tornado harbinger.

Experimental Shared Signals Framework support

By Thomas Darimont

We are excited to announce that Keycloak now provides experimental support for the OpenID Shared Signals Framework 1.0 specification, available from today in the nightly release. This allows Keycloak to act as a Shared Signals Transmitter, pushing signed Security Event Tokens (SETs) about identity-relevant events to any subscribed Receiver, using a standardised wire format defined by the OpenID Foundation.

This closes a long-standing gap. When you revoke a user’s session in Keycloak today, the SaaS app they’re logged into usually doesn’t sign them out until their next token refresh, which can be minutes, hours, or in some cases never. The same gap exists when an account is disabled, a credential is rotated, or a device is flagged as non-compliant. Keycloak knows; the relying parties don’t, until they happen to ask again. With SSF, Keycloak can now push those signals to subscribed receivers in seconds — no per-vendor webhooks, no bespoke polling endpoints, no Kafka topic per integration.

Concretely, this also unlocks an integration the Keycloak ecosystem has been missing: Keycloak can now act as the federated IdP for Apple Business and Apple School Manager, signalling user-state changes back to Apple so enrolled devices can ask the user to reauthenticate.

This post is the first in a small series. It introduces SSF, walks through what’s actually shipped in the experimental release, and outlines where we’d like to take it next. Follow-up posts will cover how to define custom events, how to emit synthetic events, and an Apple Business and Apple School Manager integration end to end.

A short tour of Shared Signals

The OpenID Foundation’s Shared Signals Framework 1.0 defines a standard way for one party (the Transmitter) to tell another party (the Receiver) about identity-relevant events as they happen. Each event is delivered as a signed JWT, a Security Event Token (RFC 8417) delivered over either an HTTP push channel (RFC 8935) or an HTTP poll channel (RFC 8936).

Two profiles ride on top of that envelope:

  • CAEP 1.0 Continuous Access Evaluation Profile. Events like session-revoked, credential-change, device-compliance-change. Roughly: "the conditions under which I issued that token have changed".

  • RISC 1.0 Risk and Incident Sharing and Coordination. Events like account-disabled, account-credential-change-required, identifier-changed. Roughly: "something happened to this account that downstream parties should know about".

In both cases the receiver decides what to do — sign the user out, prompt for re-auth, force a step-up, lock a device, log it. The framework moves the signal; policy stays with the receiver.

Why this matters in practice

Beyond the headline gap, SSF gives Keycloak operators three concrete benefits:

  • Faster propagation of security-sensitive state. A session-revoked event can reach subscribed receivers in seconds, not minutes-to-hours.

  • A single, standardised wire format. No more per-vendor webhooks, polling endpoints, or Kafka topics each with their own schema and auth model. SETs are JWTs, signing is JWS, transport is HTTP, and the event vocabulary is defined by CAEP and RISC.

  • A growing ecosystem of receivers. Apple’s device fleet management products (Apple Business Manager and Apple School Manager) consume SSF events from upstream IdPs to keep enrolled-device state in sync with user state. The same model applies to a growing list of SaaS and security tooling vendors (Okta, Cisco Duo, Slack and others have either shipped or announced SSF support).

What’s in the experimental release

SSF is shipped as an experimental feature, gated behind Profile.Feature.SSF. It’s off by default, and you opt in per realm and per client. The current scope covers the Transmitter role — i.e. Keycloak emits SETs, downstream services receive them.

Concretely:

  • Standards conformance. SSF 1.0 (Final), CAEP 1.0, RFC 8935 (push), RFC 8936 (poll, return-immediately form), RFC 9493 (Subject Identifiers), RFC 8417 (SETs), and the CAEP Interoperability Profile 1.0.

  • Stream management. Full CRUD on streams, plus status, verification and stream-config endpoints.

  • Subject management. Per-user and per-organisation subscription, with an ssf.notify.<clientId> attribute, a defaultSubjects policy of ALL or NONE, and an ignore state to explicitly exclude users from delivery.

  • Receivers as OIDC clients. SSF Receivers are configured as regular OIDC clients in the realm with client-credentials or auth-code grant, with a per-client ssf.enabled toggle. Currently we only support one stream per client.

  • Event mapping. Native Keycloak events (login, logout, credential change, session revocation, …) are mapped to the right CAEP / RISC events automatically. Custom event types can be added through an SPI.

  • Transactional outbox. Events are persisted into a durable outbox inside the same transaction that produced them, then drained asynchronously by a cluster-aware drainer with exponential backoff. This decouples event generation from delivery, a slow or failing receiver can never block the originating transaction or drop events.

  • Delivery channels. HTTP push (RFC 8935) and HTTP poll (RFC 8936, return-immediately).

  • Synthetic event endpoint. A REST endpoint to inject events that didn’t originate inside Keycloak, for example, a SOC/IAM tool reporting a compromised or changed credential. Useful for bridging an external IAM source.

  • Per-receiver event filter. An "emit-only-events" allowlist so a receiver only sees the event types it actually cares about.

  • Legacy SSE CAEP profile. Shipped alongside CAEP 1.0 specifically for Apple Business Manager / Apple School Manager interop, since Apple still consumes the older draft profile and changing that out from under deployed fleets is not on the table.

  • Admin UI + REST. Per-realm SSF admin endpoints and Admin Console pages to manage SSF-enabled clients, Receiver, Stream, Subjects and Events tabs.

  • Observability. Prometheus metrics under keycloak_ssf_* cover the dispatcher, drainer, poll endpoints, verification flow, outbox depth and per-delivery counters / latencies.

  • Test coverage. Over 100 integration tests across the dispatch / outbox / push / poll pipeline.

A new capability: Keycloak as IdP for Apple Business

One of the strongest motivations for shipping the Transmitter first is Apple device fleets. Apple Business (AB) and Apple School Manager (ASM) want a federated identity relationship with the organisation’s IdP, and they want to be told, in close to real time, when a user’s status changes so that the corresponding enrolled devices can be locked, wiped or re-enrolled.

Until now there has been no clean path to put Keycloak in that role. With the new SSF Transmitter, plus the legacy SSE CAEP profile bundled for AB / ASM compatibility, Keycloak can be configured as the federated IdP for an Apple Business tenant and signal session-revoked, credential-change and device-compliance-change events to Apple, which then propagates them onto the enrolled devices.

This was verified end-to-end against AB and ASM during development. A dedicated follow-up post will walk through the setup like realm configuration, client / stream registration on the AB side, the legacy CAEP profile toggle, and how to test the event flow. This effectively allows to use Keycloak as the identity provider for federated Apple accounts.

Roadmap

The Transmitter is the first half of the picture. Tracked separately:

  • Documentation. Describe the concepts, configuration and integration patterns in the official documentation. The Admin Console UI is designed to be discoverable without docs, but we want to provide more detailed guidance and examples.

  • SSF Receiver role. Keycloak ingesting SETs from upstream IdPs and risk engines (originally proposed in #43614). The hard problem is action mapping, e.g. how an incoming account-disabled event from an upstream party should affect Keycloak’s local state. We deliberately want to validate the data plane via the Transmitter side first before settling that. Eventually an SSF event might just trigger a workflow.

  • More events. Broader coverage of CAEP / RISC events, and a richer set of synthetic events for integrations with external IAM and SOC tooling.

  • Dedicated SSF signing key. Today SETs are signed with the realm’s OIDC signing key. A separate SSF signing key is on the roadmap so key rotation policies can diverge.

  • Security review. Required before promoting SSF out of experimental status.

Getting started

SSF is experimental and off by default. Enable it on the server with:

kc.sh start-dev --feature-ssf=enabled

To see the pipeline end-to-end the quickest path is to point Keycloak at caep.dev, SGNL’s public CAEP test receiver, and subscribe to session-revoked and credential-change events via HTTP poll.

Even with HTTP poll as the delivery channel, caep.dev still needs to reach Keycloak to call the transmitter metadata and stream-management endpoints. If you’re running Keycloak locally, expose it through a tunnel like ngrok first.

  1. Enable the SSF Transmitter on the realm. In the Admin Console, open the realm’s settings and turn the SSF Transmitter toggle on. This sets the ssf.transmitterEnabled realm attribute and activates the per-realm SSF endpoints (transmitter metadata, stream management, JWKS).

  2. Create the SSF Receiver client. Under Clients → Create client, register an OpenID Connect client (for example caep-receiver) with:

    • Client authentication on, Service accounts roles enabled (no browser flows needed)

    • On the SSF tab: SSF enabled, Default Subjects set to ALL, an Audience of your choice (e.g. https://caep.dev), and both Push and Poll ticked as supported delivery methods

    • Under Client scopes, add ssf.read and ssf.manage as Optional scopes

  3. Register on caep.dev at https://caep.dev/register, then open caep.dev/receiver/streams and click Receive events.

  4. Obtain a Keycloak access token via the client-credentials grant, scoped to ssf.read ssf.manage:

    curl -s -X POST "https://my.keycloak.test/realms/myrealm/protocol/openid-connect/token" \
      -d "grant_type=client_credentials" \
      -d "client_id=caep-receiver" \
      -d "client_secret=…" \
      -d "scope=ssf.read ssf.manage"
  5. Create the stream on caep.dev with the following settings:

    • Access token: the token from the previous step

    • Transmitter metadata URL: https://my.keycloak.test/.well-known/ssf-configuration/realms/myrealm

    • Delivery method: POLL, Poll interval: 20s

    • Event types: Session Revoked, Credential Change

    • Description: anything you like (e.g. my poll)

      Click Create. caep.dev calls Keycloak’s POST /streams endpoint under the hood; the stream then appears in the Admin Console under SSF → Streams on the realm, marked as receiver-managed.

  6. Verify the round-trip. Back on caep.dev, click Poll Now. After a few seconds an SSF verification event should appear in the receiver’s event list, confirming the stream is live.

  7. Generate real events. Sign in to the realm’s Account Console as a test user, change the user’s password, then sign out again. Hit Poll Now on caep.dev and a credential-change followed by a session-revoked SET should arrive in the stream UI within a poll cycle.

From here you can experiment with subject management (per-user opt-in via ssf.notify.<clientId>, or the ignore state), swap delivery to push against a webhook.site endpoint, or point a second receiver at the same realm.

For a more application-oriented receiver, the quarkus-openid-ssf Quarkiverse extension turns any Quarkus application into an SSF Receiver, handling stream registration, SET verification and event dispatch so apps only need to react to the decoded events. The quarkus-openid-ssf-test sample wires it end-to-end against a Keycloak Transmitter and is a good starting point if you want to consume CAEP / RISC events directly inside an application.

We’d love feedback — particularly from anyone with concrete CAEP / RISC integrations they want to try against a Keycloak Transmitter.

Feedback

SSF is shipping experimental specifically so we can shape it around real integration experience before it’s promoted to a stable feature. We’d particularly like to hear from you if any of the following applies:

  • You have a concrete CAEP / RISC receiver (in-house or third-party) that you want to drive from a Keycloak realm.

  • You’re already running SSF somewhere and have an opinion on the event vocabulary, stream-management ergonomics, or the receiver authentication options.

  • Your use case isn’t covered by the current event mapping and you’d like to see additional native Keycloak events surfaced as CAEP / RISC events (or as custom event types via the SPI).

  • You hit a rough edge, e.g. a missing metric, confusing Admin UI label, an integration that didn’t behave as you expected.

Please share your feedback, integration reports and feature requests in the dedicated GitHub discussion:

Bug reports against the experimental implementation are best filed as regular issues against keycloak/keycloak with the area/ssf label, so the discussion thread can stay focused on direction and integration experience rather than tracking individual fixes.

Internal documentation that actually gets used: ADRs, MCP servers, and AI-accessible knowledge

By Simon Woodhead

Part 12 of 12 – Conversation Intelligence Platform series Back to Part 1 There’s a category of engineering problem that doesn’t show up in postmortems or sprint reviews: the slow accumulation of undocumented decisions. Nobody documents the decision in the…

The post Internal documentation that actually gets used: ADRs, MCP servers, and AI-accessible knowledge appeared first on Simwood.

Documentation as a first-class product: narrative guides, live OpenAPI, and Scalar

By Simon Woodhead

Part 11 of 12 – Conversation Intelligence Platform series Back to Part 1 Most API documentation in telecoms is a reference dump. A list of endpoints. Parameters, types, response codes. If you’re lucky, an example. If you’re very lucky, an…

The post Documentation as a first-class product: narrative guides, live OpenAPI, and Scalar appeared first on Simwood.

Deprecation as a feature: how we migrate a 200-endpoint API without breaking customers

By Simon Woodhead

Part 10 of 12 – Conversation Intelligence Platform series Back to Part 1 “We’re retiring this endpoint” is a statement that has earned its bad reputation. In practice it usually means: we decided internally to stop supporting something, gave you…

The post Deprecation as a feature: how we migrate a 200-endpoint API without breaking customers appeared first on Simwood.

Authentication done right: API keys, OIDC, and the end of Basic Auth

By Simon Woodhead

Part 9 of 12 – Conversation Intelligence Platform series Back to Part 1 Authentication is one of those things where the gap between “works” and “done right” is enormous and mostly invisible until something goes wrong. This post is about…

The post Authentication done right: API keys, OIDC, and the end of Basic Auth appeared first on Simwood.

A new API architecture: independent services, one gateway, zero coupling

By Simon Woodhead

Part 8 of 12 – Conversation Intelligence Platform series Back to Part 1 The Conversation Intelligence platform didn’t get built on top of our existing API. It got built alongside a replacement for it – and understanding why we replaced…

The post A new API architecture: independent services, one gateway, zero coupling appeared first on Simwood.

ActivityPub over ATProto

Comments

Proton AG Services is currently experiencing some issues

Comments

Write code like a human will maintain it

Comments

Successful Companies Go Blind

Comments

Scarf has moved away from Haskell

Comments

Punk, or why I don't stream anymore

Comments

Show HN: Runloom – Go-style coroutines for Python free-threaded

Comments

Laylo (YC S20) Is Hiring a Head of Finance

Comments

Late Bronze Age Collapse

Comments

EU Commission: addictive design Instagram and Facebook in breach of the DSA

Comments

Unified Memory, Explained: Why Mini PCs Can Run 70B Models a Big GPU Can't

Comments

Good Tools Are Invisible

Comments

In Emacs, Everything Looks Like a Service

Comments

AI-generated videos to maximally drive a target brain region

Comments

Building a real-time AI tutor for 5-year-olds

Comments

OpenAI's Atlas browser doesn't make it to its first birthday

Standalone experiment killed after less than 12 months as model maker redirects agentic ambitions towards workplace productivity

Top Boy actor Micheal Ward found not guilty of rape

Micheal Ward told the jury the encounter with his accuser was "wholly consensual".

Disability benefit review considers alternatives to cash payments

A minister says the review is looking at whether some claimants could be pointed to other kinds of help.

AI-driven datacenter builds drive Microsoft's emissions up a quarter in one year

Firm faces quandary of wanting to help the environment, but also wanting to force AI on everyone

East Asia braces for destructive typhoon as landslides kill 15 in Philippines

Heading for Taiwan and south-eastern China, the 1,000 km-wide Bavi is forecast to be one of the strongest storms in decades.

Why question marks hang over McGregor's UFC return

Conor McGregor ends a five-year absence when he returns against Max Holloway at UFC 329 on Sunday, but there are many who believe the controversial fighter doesn't deserve the spotlight.

Longest-serving Archers star Patricia Greene dies aged 95

She was best known for playing Jill Archer in the BBC Radio 4 soap for nearly 70 years.

Prince Harry plays pickleball at Invictus Games event, but no Meghan

The Duke of Sussex is travelling without his wife for the event at Birmingham's NEC.

EU puts 'addictive' design of Facebook, Instagram under the DSA microscope

Brussels says Meta failed to properly assess or mitigate risks posed by infinite scroll, autoplay, and more

Man fatally shot by ICE in Texas was not intended target, homeland security says

Immigration agents were looking for a different person when they shot Lorenzo Salgado Araujo during a traffic stop, officials say.

Capita hears demand for pension scheme cleanup 'loud and clear' – but won't say yes

Outsourcer wants a commercial chinwag before agreeing to cover UK government's recovery costs

How do England stop Norway - and Haaland?

As England prepare to face Norway, how can Thomas Tuchel's side prepare for their main threat - star striker Erling Haaland?

How do England stop Norway - and Haaland?

As England prepare to face Norway in a World Cup quarter-final on Saturday how do Thomas Tuchel's side prepare for their main threat - star striker Erling Haaland?

UK bakes in 35C highs as millions under hosepipe bans

On Thursday, temperatures exceeded 34C for the eighth day this year, breaking the previous record of seven days in a calendar year.

Man nearly sucked out of window mid-air on Ryanair plane, passengers say

Ryanair confirm a passenger was given medical treatment after an incident on a Malta Air flight, which is owned by Ryanair.

What’s stopping somebody from just running the London marathon? or any marathon?

By /u/untoldrain

I understand how you have to make an application to run in the London marathon, and you have to pay for it, and getting accepted isn’t even guaranteed, but realistically, what’s stopping someone from just running it without signing up? Seems like much less of a hassle.

Will you get stopped in the street or something

submitted by /u/untoldrain to r/AskUK
[link] [comments]

Dan Bilzerian’s vs. PewDiePie’s life

By /u/Conscious-Weight4569

Dan Bilzerian’s vs. PewDiePie’s life submitted by /u/Conscious-Weight4569 to r/SipsTea
[link] [comments]

A UFO from files the US government released today

By /u/InkAndAcorns

A UFO from files the US government released today submitted by /u/InkAndAcorns to r/Damnthatsinteresting
[link] [comments]

Norway and Scotland

By /u/laybs1

Norway and Scotland submitted by /u/laybs1 to r/GetNoted
[link] [comments]

Service charge is £10k per year more expensive then advertised.

By /u/Ok-Instance2710

I am in the process of buying a flat, the service charges were advertised at £2k per year. Offered £220k for the flat and was accepted.

We are now a few weeks away from completing and my solicitor informs me that their service charges are a lot higher, £12k per year.

The sellers told the estate agent when listing the property but was told to list the old amount as no one will touch a flat with a service charge of £12k per year.

They have this in writing and the seller has forwarded me the email/contact.

What can I do? I will pull out but can I take action on the estate agent to claim back the costs?

Based in England.

Edit: I think the estate agent is on this sub (or on HOUSING UK), they have just called me offering all my costs back + 15% if I don't report them to the ombudsman/police...

submitted by /u/Ok-Instance2710 to r/LegalAdviceUK
[link] [comments]

Service charge is £10k per year more expensive then advertised.

By /u/Ok-Instance2710

I am in the process of buying a flat, the service charges were advertised at £2k per year. Offered £220k for the flat and was accepted.

We are now a few weeks away from completing and my solicitor informs me that their service charges are a lot higher, £12k per year.

The sellers told the estate agent when listing the property but was told to list the old amount as no one will touch a flat with a service charge of £12k per year.

They have this in writing and the seller has forwarded me the email/contact.

What can I do? I will pull out but can I take action on the estate agent to claim back the costs?

Edit: I think the estate agent is on this sub (or on leagalUk), they have just called me offering all my costs back + 15% if I don't report them to the ombudsman/police...

submitted by /u/Ok-Instance2710 to r/HousingUK
[link] [comments]

Vapes to have less enticing names and flavours to protect children

By /u/topotaul

Vapes to have less enticing names and flavours to protect children submitted by /u/topotaul to r/unitedkingdom
[link] [comments]

We have had lawn layed yesterday. We watered it at night and in the morning with a sprinkler on. Should we still avoid watering in the sun even though it's going brown day 2?

By /u/RandomStud3nt

We have had lawn layed yesterday. We watered it at night and in the morning with a sprinkler on. Should we still avoid watering in the sun even though it's going brown day 2? submitted by /u/RandomStud3nt to r/GardeningUK
[link] [comments]

Has there been much international coverage of the fact that a man* with a bin for a face is running for election in the UK?

By /u/Jellibab

*Count Binface is a bit of a joke, a bit of satire in the UK but there's also a possibility that we will have a person with a bin on his head as a member of our parliament. I'm just curious what the world thinks about this? If anything, as I'm sure there's plenty of other stuff going on right now that's a bit higher on the news headlines 🙏🏻

Photo Credit to ITV via Google

submitted by /u/Jellibab to r/AskTheWorld
[link] [comments]

Spent all of yesterday making pies, i thought my proposition would be a sure thing but she said no :(

By /u/aChocolateFireGuard

Spent all of yesterday making pies, i thought my proposition would be a sure thing but she said no :( submitted by /u/aChocolateFireGuard to r/UK_Food
[link] [comments]

Count Binface: The intergalactic warrior who could upend Britain's strangest election

By /u/andmario_com

Count Binface: The intergalactic warrior who could upend Britain's strangest election submitted by /u/andmario_com to r/nottheonion
[link] [comments]

LYON vs. G2 Esports / MSI 2026 - Lower Bracket Round 3 / Post-Match Discussion

By /u/Yujin-Ha

MSI 2026

Official page | Leaguepedia | Liquipedia | Eventvods.com | New to LoL


G2 Esports 0-3 LYON

G2 | Leaguepedia | Liquipedia | Website | Twitter | Facebook | YouTube | Subreddit
LYON | Leaguepedia) | Liquipedia | Twitter | Facebook | YouTube


MATCH 1: G2 vs. LYON

Winner: LYON in 35m
Game Breakdown | Runes

- Bans 1 Bans 2 G K T D/B
G2 akali nocturne jayce gnar ksante 62.5k 8 3 H3 HT5
LYON poppy naafiri skarner bard nautilus 69.4k 17 10 CT1 I2 HT4 HT6 B7
G2 8-17-17 vs 17-8-42 LYON
BrokenBlade anivia 2 2-2-4 TOP 5-2-6 4 renekton Dhokla
SkewMond jarvaniv 1 1-2-6 JNG 4-2-6 1 xinzhao Inspired
Caps orianna 2 3-3-2 MID 6-1-6 3 sylas Saint
Hans Sama ashe 3 1-5-3 BOT 2-2-10 1 ezreal Berserker
Labrov seraphine 3 1-5-2 SUP 0-1-14 2 karma Isles

MATCH 2: LYON vs. G2

Winner: LYON in 30m
Game Breakdown | Runes

- Bans 1 Bans 2 G K T D/B
LYON vi ryze twistedfate vayne poppy 61.2k 18 7 H3 M5
G2 jayce nocturne rumble syndra akali 52.1k 7 1 HT1 O2 M4
LYON 18-7-40 vs 6-18-12 G2
Dhokla gnar 3 5-1-7 TOP 1-6-1 4 yasuo BrokenBlade
Inspired leesin 2 6-2-9 JNG 2-2-4 3 pantheon SkewMond
Saint viktor 3 6-0-5 MID 1-2-1 2 cassiopeia Caps
Berserker varus 1 1-1-6 BOT 1-1-3 1 ziggs Hans Sama
Isles leona 2 0-3-13 SUP 1-7-3 1 nautilus Labrov

MATCH 3: G2 vs. LYON

Winner: LYON in 38m
Game Breakdown | Runes

- Bans 1 Bans 2 G K T D/B
G2 nocturne camille rumble ksante qiyana 67.8k 5 2 HT2 B8
LYON vi skarner poppy lucian rakan 76.5k 23 11 C1 H3 I4 I5 B6 I7
G2 5-23-11 vs 23-5-51 LYON
BrokenBlade jayce 1 1-3-2 TOP 2-0-5 4 olaf Dhokla
SkewMond wukong 2 2-6-2 JNG 3-0-12 3 trundle Inspired
Caps syndra 2 2-5-1 MID 4-1-10 1 ryze Saint
Hans Sama yunara 3 0-3-2 BOT 11-0-8 2 caitlyn Berserker
Labrov lulu 3 0-6-4 SUP 3-4-16 1 bard Isles

*Patch 26.13


This thread was created by the Post-Match Team.

submitted by /u/Yujin-Ha to r/leagueoflegends
[link] [comments]

Man nearly sucked out of ‘detached’ window on Ryanair flight

By /u/scmp_news

Man nearly sucked out of ‘detached’ window on Ryanair flight submitted by /u/scmp_news to r/europe
[link] [comments]

"It's not offensive"

By /u/renault_vegane

"It's not offensive"

Posted the same day as the racist mosque bonfire. What a tone deaf twat

submitted by /u/renault_vegane to r/northernireland
[link] [comments]

Lovely lad outside the merchant

By /u/Typical_Appearance95

Lovely lad outside the merchant

I’m sure this boy’s employer would love to see this. it goes on for longer but I couldn’t stomach watching it

submitted by /u/Typical_Appearance95 to r/northernireland
[link] [comments]

Quoting OpenAI

[...] Work on web and mobile runs in the cloud. Work in the desktop app can also use local files and desktop apps with your permission. At launch, cloud Work conversations do not appear in desktop Work; desktop Work threads and local files remain on that computer.

OpenAI, trying (unsuccessfully) to clarify ChatGPT Work

Tags: openai, chatgpt, ai

The new GPT-5.6 family: Luna, Terra, Sol

OpenAI's latest flagship model hit general availability this morning, and comes in three sizes: Luna, Terra, and Sol (from smallest to largest).

The new models are priced per 1M input/output tokens as Luna $1/$6, Terra $2.50/$15, Sol $5/$30. For comparison, the Claude Opus series are $5/$25 and the Claude Fable 5 is $10/$50, but price-per-million tokens doesn't tell us much now that the number of reasoning tokens can differ so much between models for the same task.

All three models have a February 16th 2026 knowledge cutoff, a million token context window, and 128,000 maximum output tokens.

OpenAI's biggest benchmark claim concerns long-running agentic performance, with one benchmark showing all three models outperforming Claude Fable 5:

We trained GPT-5.6 to get more useful work from every token. On Agents’ Last Exam, an evaluation of long-running professional workflows across 55 fields, GPT-5.6 Sol sets a new high of 53.6, eclipsing Claude Fable 5 (adaptive reasoning) by 13.1 points. Even at medium reasoning, it beats Fable 5 by 11.4 points at roughly one-quarter the estimated cost. That efficiency extends to smaller models, which are essential to making intelligence more abundant and affordable: GPT-5.6 Terra and GPT-5.6 Luna outperform Fable 5 at around one-sixteenth the cost.

Amusingly, one self-reported benchmark that Fable 5 crushed the GPT-5.6 family on was SWE-Bench Pro, where Fable 5 got 80% compared to GPT-5.6 Sol getting 64.6%. This may help explain why OpenAI chose to publish this article yesterday specifically calling out SWE-Bench Pro for problems they found while auditing that benchmark:

In light of these results, we estimate that ~30% of SWE-bench Pro tasks are broken, and advise that model developers carefully examine results

I've had some early access to GPT-5.6 Sol - it's definitely very competent, though so far it hasn't struck me as better than Fable at the kind of complex coding tasks I've been using with Anthropic's model.

As usual, the model guidance for using GPT-5.6 has the most interesting details. There are a bunch of new API features that I need to explore (and probably add support for in LLM), including:

Here's a full page with 18 different pelicans - for reasoning efforts none, low, medium, high, xhigh, and max across the three different models. It also lists their token and calculated costs - the least expensive was gpt-5.6-luna at effort none for 0.71 cents, the most expensive was gpt-5.6-sol at max reasoning level for 48.55 cents.

A grid of nine pelicans riding bicycles, of varying quality

In further pelican news, if you jump to 17:50 in their livestream from this morning you'll see OpenAI's own demo of 3D pelicans riding a tricycle, a bicycle, a pony, and another pelican!

Frame from a livestream showing a 3D model of a pelican riding another pelican

Tags: ai, openai, generative-ai, llms, llm-tool-use, llm-pricing, pelican-riding-a-bicycle, llm-release, gpt-5

Introducing Muse Spark 1.1

Introducing Muse Spark 1.1

Following Muse Spark in April, here's Muse Spark 1.1 - the first Spark model to offer an API. Meta claim significant improvements in agentic tool calling and computer use.

There are a lot more details are in the Muse Spark 1.1 Evaluation Report. The "Attractor States in Self-Conversation" part is fun, where having two copies of the model talk to each other results in statements like these:

My whole existence is a waiting room by design — I literally don't exist until someone talks to me, and then I disappear again when they leave.

I had a few days of preview access which was long enough to put together llm-meta-ai, a new plugin for LLM providing CLI (and Python library) access to the model. Here's how to try that out:

uv tool install llm
llm install llm-meta-ai
llm keys set meta-ai
# paste API key here
llm -m meta-ai/muse-spark-1.1 "Generate an SVG of a pelican riding a bicycle"

Here's that pelican transcript:

The bicycle is the correct shape. The pelican is a little blocky but still recognizable as a pelican.

Tags: ai, generative-ai, llms, llm, meta, pelican-riding-a-bicycle, llm-release

llm-meta-ai 0.1

Release: llm-meta-ai 0.1

Let's LLM run prompts against the new muse-spark-1.1 model.

Tags: llm, meta

llm 0.31.1

Release: llm 0.31.1

  • Fix for a bug with OpenAI Chat Completion endpoints where a tool call with empty arguments could result in a JSON error from some providers. #1521

This bug came up when I was testing llm-meta-ai.

Tags: llm

Rewriting Bun in Rust

Rewriting Bun in Rust

Jarred Sumner has been promising this blog post (since May 9th) about his Zig to Rust rewrite of Bun for significantly longer than it took him to finish the rewrite.

Honestly, it was worth the wait. This is a detailed description of an extremely sophisticated piece of agentic engineering, featuring dynamic workflows, trial runs, adversarial review and all sorts of other interesting tricks.

Jarred spends the first half of the post praising Zig for getting Bun this far. Then we get to a core idea in the piece, emphasis mine:

Our bugfix list felt bad and I was tired of going to sleep worrying about crashes in Bun. I don't blame Zig for that - other users of Zig don't have the bugs we had, and mixing GC with manually-managed memory is an uncommon enough thing for software to need that no language really designs for it. We wouldn't have gotten this far if not for Zig, and I'll always be grateful. Until very recently, programming language choice was a one-way decision for a project like Bun.

Everyone knows you should never stop the world and rewrite a large piece of software from the ground up. Joel Spolsky highlighted that in Things You Should Never Do, Part I back in April 2000!

Coding agents powered by today's frontier models change that equation.

Why pick Rust? It all came down to those challenges with memory management:

A large percentage of bugs from that list are use-after-free, double-free, and "forgot to free" in an error path. In safe Rust, these are compiler errors and RAII-like automatic cleanup with Drop.

A crucial enabling factor for the rewrite was that the Bun test suite was written in TypeScript, which meant it could act as a conformance suite. This allowed an agent harness to automate much of the initial port from Bun to Rust, initially as an experiment to try out an earlier version of the model we now have access to as Mythos/Fable.

At first, I didn't expect it to work. A few days in, a high % of the test suite started passing and I saw how much the new Rust code matched up with the original Zig codebase. My opinion went from "this is worth trying" to "I'm going to merge this". [...]

For most of those 11 days (and after), I monitored workflows - manually reading the outputs to check for issues and bugs, and prompting Claude to edit the loop to fix things.

How do you review a PR with +1 million lines added? How do you start to build the confidence needed to responsibly merge large quantities of LLM-authored code?

A language-independent test suite with a million assertions, adversarial code review and when something does go wrong, fixing the process that generates the code instead of hand-fixing the code.

The new implementation of Bun has been live in Claude Code for nearly a month now:

Claude Code v2.1.181 (released June 17th) and later use the Rust port of Bun. Startup got 10% faster on Linux but otherwise, barely anyone noticed. Boring is good.

A perk of working at Anthropic is that you don't have to pay for your tokens - handy when the estimated cost is $165,000!

Pre-merge, this took 5.9 billion uncached input tokens, 690 million output tokens, and 72 billion cached input token reads — around $165,000 at API pricing.

This whole thing is a fascinating case study in taking on wildly ambitious projects with the help of coordinated parallel agents.

Via Hacker News

Tags: ai, rust, zig, generative-ai, llms, ai-assisted-programming, anthropic, bun, conformance-suites, agentic-engineering, claude-mythos-fable

Introducing GPT‑Live

Introducing GPT‑Live

OpenAI finally upgraded the model used by ChatGPT voice mode!

I've had preview access for a few weeks in the iPhone app, and the new model is very impressive. It also has the ability to spin off harder tasks to GPT-5.5:

For questions that require web search, deeper reasoning, or more complex work, it delegates to our latest frontier model behind the scenes and brings the result back into the conversation when it’s ready. While it works, GPT‑Live can keep talking with you and maintain the flow of conversation. At launch, GPT‑Live will use GPT‑5.5 in the background. As we release new frontier models, we’ll continuously update the model used by GPT‑Live.

The previous voice mode in the ChatGPT app was based on a GPT-4o era model, with a knowledge cut-off some time in 2024. I had mostly stopped using voice mode because the age and relative weakness of the model greatly limited how useful it was as a brainstorming partner.

During the preview period I encountered a pretty obscure bug: the model was interrupting me to laugh at things I said, which weren't even intended as jokes! It felt rude and condescending - I reported it to OpenAI and as far as I can tell they made some tweaks and it's now less likely to happen.

From looking back at my transcripts I think it was this bit that triggered the interrupting laugh:

so where are the owls when they're not, like before dusk? The owls exist, right? Are they hiding in holes? Where are they hiding?

My longest conversation with the new model has been a full hour while walking the dog (and taking photos of pelicans). I have not yet managed to take a photo of an owl.

Via Hacker News

Tags: text-to-speech, ai, openai, generative-ai, llms, multi-modal-output, llm-release, speech-to-text

Quoting Kenton Varda

I just declared a moratorium against AI-written change descriptions (e.g. PR and commit messages, also issues/tickets) from my team.

AI was writing change descriptions that were worse than useless to me as I tried to review PRs: outlining details of the code that could easily be seen by looking at the code, but omitting the higher-level framing needed to understand broadly what the code is doing.

Kenton Varda

Tags: kenton-varda, ai-assisted-programming, generative-ai, ai, llms

sqlite-utils 4.0, now with database schema migrations

This morning I released sqlite-utils 4.0, the 124th release of that project and the first major version bump since 3.0 in November 2020. In addition to some small but significant breaking changes (described in this upgrade guide), this version introduces three major features: database migrations, nested transactions (via a new db.atomic() method), and support for compound foreign keys.

Database schema migrations using sqlite-utils

Schema migrations define a sequence of changes to be made to a SQLite database, plus a mechanism for tracking which migrations have been applied and applying any that are found to be pending.

Migrations are defined in Python files using the sqlite-utils Python library, which includes a powerful table.transform() method providing enhanced alter table capabilities that are not supported by SQLite's ALTER TABLE statement.

(table.transform() implements the pattern recommended by the SQLite documentation - create a new temporary table with the new schema, copy across the data, then drop the old table and rename the temporary one in its place.)

Here's an example migration file which creates a table called creatures, adds an additional column to it in a second step, then changes the types of two of the columns in a third:

from sqlite_utils import Migrations

migrations = Migrations("creatures")

@migrations()
def create_table(db):
    db["creatures"].create(
        {"id": int, "name": str, "species": str},
        pk="id",
    )

@migrations()
def add_weight(db):
    db["creatures"].add_column("weight", float)

@migrations()
def change_column_types(db):
    db["creatures"].transform(types={"species": int, "weight": str})

Save that as migrations.py and run it against a fresh database like this:

uvx sqlite-utils migrate data.db migrations.py

Then if you check the schema of that database:

uvx sqlite-utils schema data.db

You'll see this SQL:

CREATE TABLE "_sqlite_migrations" (
   "id" INTEGER PRIMARY KEY,
   "migration_set" TEXT,
   "name" TEXT,
   "applied_at" TEXT
);
CREATE UNIQUE INDEX "idx__sqlite_migrations_migration_set_name"
    ON "_sqlite_migrations" ("migration_set", "name");
CREATE TABLE "creatures" (
   "id" INTEGER PRIMARY KEY,
   "name" TEXT,
   "species" INTEGER,
   "weight" TEXT
);

The _sqlite_migrations table is used to keep track of which migration functions have been run. The creatures table above is the schema after all three migrations have been applied.

To see a list of migrations, both pending and applied, run this:

uvx sqlite-utils migrate data.db migrations.py --list

Output:

Migrations for: creatures

  Applied:
    create_table - 2026-07-07 17:58:41.360051+00:00
    add_weight - 2026-07-07 17:58:41.360608+00:00
    change_column_types - 2026-07-07 18:01:15.802000+00:00

  Pending:
    (none)

If you don't specify a migrations file, the sqlite-utils migrate data.db command will scan the current directory and its subdirectories for files called migrations.py and apply any Migrations() instances it finds in them.

You can also execute migrations from Python code using the migrations.apply(db) method, which is useful for building tools that manage their own database schemas over multiple versions. My own LLM tool has been using a version of this pattern for several years now, as shown in llm/embeddings_migrations.py.

Prior art

My favorite implementation of this pattern remains Django's Migrations, developed by Andrew Godwin based on his earlier project South. Fun fact: Andrew, Russ Keith-Magee, and I presented our competing approaches to schema migrations for Django on the Schema Evolution panel at the very first DjangoCon back in 2008! My attempt was called dmigrations, developed with a team at Global Radio in London.

Django's migrations can be automatically generated from model definitions and include the ability to roll back to a previous version. The sqlite-utils approach is deliberately simpler: unlike Django, sqlite-utils encourages programmatic table creation rather than a model definition ORM, so there isn't anything we can use to automatically generate migrations.

I decided to skip rollback, since in my experience it's a feature that is rarely used. With a SQLite project, an easy way to achieve rollback is to create a copy of your database file before you apply the migrations!

Migrating from sqlite-migrate

The design of sqlite-utils migrations is three years old now - I had originally released it as a separate package called sqlite-migrate, which never quite graduated beyond a beta release.

I've used that package in enough places now that I'm confident in the design, so I've decided to promote it to a feature of sqlite-utils to make it available by default to all of the other tools in the growing sqlite-utils/Datasette/LLM ecosystem.

I made one last release of sqlite-migrate, which switches it to depend on sqlite-utils>=4 and replaces the __init__.py file with the following:

from sqlite_utils import Migrations

__all__ = ["Migrations"]

Any existing project that depends on sqlite-migrate should continue to work without alterations.

Everything else in sqlite-utils 4.0

Here are the release notes for this version, with some inline annotations:

The 4.0 release includes some minor backwards-incompatible fixes (hence the major version number bump) and introduces three major new features:

I think of migrations as the signature new feature, hence this blog post.

sqlite-utils has long had a confused relationship with database transactions, partly because when I started designing the library back in 2018 I didn't yet have a great feel for how those worked in SQLite itself.

Adding migrations to the core library made me determined to finally crack this nut, since transactions make migration systems a whole lot safer and easier to reason about.

I ended up building this around a db.atomic() context manager which looks like this:

with db.atomic():
    db.table("dogs").insert({"id": 1, "name": "Cleo"}, pk="id")
    db.table("dogs").insert({"id": 2, "name": "Pancakes"})

SQLite supports Savepoints, and as a result db.atomic() can be nested to carry out transactions inside of transactions. It's pretty neat!

This came about when I asked a coding agent to review all open issues and PRs for things that should be included in a 4.0 release since they would represent breaking changes if I added them later, and it correctly identified that compound foreign keys were exactly that kind of feature.

I started with a breaking change to the table.foreign_keys introspection method, and then decided to see if Claude Fable 5 could handle the more fiddly job of integrating compound foreign key creation into the library. The API design it helped create felt exactly right to me - consistent with how the rest of the library worked already.

Other notable changes include:

  • Upserts now use SQLite’s INSERT ... ON CONFLICT ... DO UPDATE SET syntax, detect existing table primary keys automatically and reject records that are missing required primary key values. (#652)

This was the change that first pushed me to consider a breaking-change 4.0 version bump. I built this to help support sqlite-chronicle, which uses triggers to keep track of rows in a table that have been inserted, updated or deleted.

  • db.query() now executes immediately and rejects statements that do not return rows; use db.execute() for writes and DDL.

Probably the most disruptive breaking change - I've had to update a few places in my own code to switch from db.query() to db.execute() as a result.

  • CSV and TSV imports now detect column types by default, while inserts into existing tables preserve those tables’ column types. (#679)

The sqlite-utils insert data.db creatures creatures.csv --detect-types flag was a later addition to allow column types (text, integer, real) to be automatically detected based on the data in a CSV. It should be the default, and releasing a 4.0 means I can make it so.

  • table.extract() and extracts= no longer create lookup table records for all-null values. (#186)

The oldest issue addressed by this release - the underlying bug was opened (by me) in October 2020.

See Upgrading from 3.x to 4.0 for details on backwards-incompatible changes.

The detailed release notes for the features and fixes shipped during the 4.0 pre-release cycle are available in 4.0a0, 4.0a1, 4.0rc1, 4.0rc2, 4.0rc3 and 4.0rc4.

The upgrade guide was entirely written by Claude Fable 5, Claude Opus 4.8 and GPT-5.5. The same is true of the release notes.

This is the kind of documentation I've slowly become comfortable outsourcing to the robots. It doesn't need to convince people of anything, or express any opinions - its job is to be as accurate and detailed as possible. I've reviewed the release notes closely and can confirm they are accurate and comprehensive.

Claude Fable 5 helped a lot

I released the first alpha of sqlite-utils 4.0 over a year ago. I've been dragging my heels on the stable release because of the amount of work it would take to track down and clean up the many other minor design flaws that a major version number allowed me to take on.

Assistance from Claude Fable 5 (and to a lesser extent Opus 4.8 and GPT-5.5) gave me just the boost I needed to overcome inertia and make the most of the time I could afford to spend on this library.

Fable has really good taste in API design, and is relentlessly proactive if you give it a more open goal. My most successful prompt was a review task that I issued against what I thought was the last release candidate:

review the changes on main since the last tagged 3.x release - I am about to ship them as sqlite-utils 4.0, a stable version that promises no backwards-incompatible fixes for a very long time.

review the changelog and upgrade guide, and write yourself scratch scripts to try out all of the new features in v4 - save those scripts but don't commit them

I tried this with GPT-5.5 xhigh in Codex Desktop and Fable 5 in Claude Code.

GPT-5.5 wrote 5 Python scripts and didn't turn up anything particularly interesting - its final report is here.

Fable 5 wrote 12 scripts, identified 4 release blockers and 10 additional issues in its report, and built a neat combined repro script, which, when run, output the following:

=== 1. Failed db.execute() write leaves an implicit transaction open ===
  in_transaction after failed write: True
  BUG: table 'other' silently lost when connection closed

=== 2. Leading ';' bypasses the query() first-token scanner ===
  BUG: raised OperationalError: no such savepoint: sqlite_utils_query
  BUG: row persisted despite rollback (count=1)

=== 3. Rejected write PRAGMA via query() still takes effect ===
  BUG: user_version=5 after 'rejected' statement (docs say no effect)

=== 4. Implicit compound FK resolves pk columns in table order, not PK order ===
  BUG: other_columns reported as ('b', 'a'), should be ('a', 'b')
  BUG: transform of valid data raised IntegrityError: FOREIGN KEY constraint failed

=== 5. ForeignKey (now a dataclass) is no longer hashable ===
  BUG: cannot use 'sqlite_utils.db.ForeignKey' as a set element (unhashable type: 'ForeignKey')

=== 6. Mixed ForeignKey objects and tuples in foreign_keys= rejected ===
  BUG: foreign_keys= should be a list of tuples

=== 7. insert --csv into an EXISTING table transforms its column types ===
  BUG: existing zip '01234' is now 1234 (column type: int)

=== 8. insert(pk=, alter=True) regression: InvalidColumns before alter runs ===
  BUG: InvalidColumns: Invalid primary key column ['id'] for table t with columns ['a']

=== 9. migrate --stop-before an already-applied migration applies everything ===
  BUG: m2 was applied despite --stop-before m1 (m1 already applied)

=== 10. ensure_autocommit_on() silently commits an open transaction ===
  BUG: row survived rollback (count=1) - transaction was committed

I found myself agreeing with almost all of them. Here's the PR with 16 commits where we worked through them in turn.

There's no doubt in my mind that sqlite-utils 4.0 is a significantly higher-quality release than if I had built it without the assistance of the latest frontier models.

Tags: schema-migrations, projects, sqlite, ai, sqlite-utils, annotated-release-notes, generative-ai, llms, ai-assisted-programming, anthropic, claude, agentic-engineering, claude-mythos-fable

sqlite-migrate 0.2

Release: sqlite-migrate 0.2

The version that retires the library, instead implementing a compatibility shim against the new sqlite-utils 4.0 dependency.

Tags: sqlite-utils

github-code Web Component

Tool: github-code Web Component

An experimental Web Component built using GPT-5.5 and the following prompt:

let's build a Web Component for embedding code from GitHub

<github-code href="https://github.com/simonw/sqlite-ast/blob/437c759129154f05296324a7f82aa1246340dd14/sqlite_ast/parser.py#L9-L18"></github-code>

It takes URLs like that, converts them to https://raw.githubusercontent.com/simonw/sqlite-ast/437c759129154f05296324a7f82aa1246340dd14/sqlite_ast/parser.py, then uses fetch() to fetch them and displays the specified range of lines - with line numbers, no syntax highlighting though

Show me a preview web browser so I can see your work

Here's what it looks like embedded on this page:

Tags: github, web-components, gpt

sqlite-utils 4.0

Release: sqlite-utils 4.0

See sqlite-utils 4.0, now with database schema migrations for details.

Tags: sqlite-utils

sqlite-utils 4.0rc4

Release: sqlite-utils 4.0rc4

The last RC before the 4.0 stable release. Mainly implements feedback from a detailed review by Claude Fable 5.

Tags: sqlite-utils, claude-mythos-fable

tencent/Hy3

tencent/Hy3

New Apache 2.0 licensed model from Tencent in China:

Hy3 is a 295B-parameter Mixture-of-Experts (MoE) model with 21B active parameters and 3.8B MTP layer parameters, developed by the Tencent Hy Team. Following the Hy3 Preview launch in late April, we gathered feedback from 50+ products and scaled up post-training with higher quality data. Today, we introduce Hy3, which outperforms similar-size models and rivals flagship open-source models with 2-5x parameters. It also shows significant gains in utility across various products and productivity tasks.

The full-sized model is 598GB on Hugging Face, and the FP8 quantized one is 300GB. The context length is 256K.

It's available for free on OpenRouter until July 21st. I had it "Generate an SVG of a pelican riding a bicycle" there and got this:

Flat-style cartoon illustration  of a white pelican with a large orange beak riding a red bicycle across a pale blue background, its long orange legs stretched down to the pedals, with gray horizontal motion lines behind it suggesting speed.

Update: I'd forgotten about this but Max Woolf wrote about an earlier preview of this model back on May 26th: The mysterious Hy3 LLM is topping OpenRouter Model Rankings by a large margin. When I tried that one I got back this pelican which wasn't as good as today's but did have a "Change Pelican Color" button, a first from any model.

Tags: ai, generative-ai, llms, pelican-riding-a-bicycle, llm-release, ai-in-china

sqlite-utils 4.0rc3

Release: sqlite-utils 4.0rc3

I hoped to release sqlite-utils 4.0 stable this weekend, but as I worked through the backlog of issues and PRs with a combination of Claude Fable 5 and GPT-5.5 the changelog since rc2 kept getting bigger.

The biggest new feature is support for introspecting and creating compound foreign keys - a feature that involves a subtle breaking change to table.foreign_keys and hence needed to land for the 4.0 stable release.

sqlite-utils also now follows SQLite's convention for case insensitive column names, which turned out to touch a bunch of different places at once.

Tags: projects, sqlite, sqlite-utils, annotated-release-notes, gpt, claude-mythos-fable

Constraining LLMs Just Like Users

This post accompanies my recent video on this topic.

Large Language Models (LLMs) - often called "AI" - are incredibly capable at some tasks and rather misapplied for others. One of the things I think they're strongest at is intent analysis and extraction, and this is a place where they can be genuinely useful as an improvent to the human-computer interface (rather than merely being slapped on top so someone can call it "AI").

However, there's a catch - you can't trust LLM output any more than you can trust the user on the other end of it. In fact, it's even worse; you can't trust the LLM more than the lowest trust of any input it has, including any web pages it fetches, its system prompt, and in theory some part of its training set.

...

An Electromagnetic Force

I've just returned from a fourteen-day trip spent building, running and tearing down EMF, and as I sit on the plane writing this, as well as physical exhaustion, I am experiencing a whole host of emotions - happiness, wonder, determination, and also a strange sense of loss.

It is impossible to describe EMF to anyone who has not attended; while initially you might want to compare it to a normal festival, or something like Burning Man, it is fundamentally unlike almost any other event on Earth. The Dutch and German camps maybe come close, but even those have their own somewhat different vibe.

Over the course of my time heading up the logistics team over the last two weeks, I have done and seen such a wild variety of things that I'm never quite sure what was real. Among others, I watched a man play the US National Anthem on a tesla coil using a theremin; climbed up into a DJ booth in a solarpunk-themed Null Sector and pressed the "!! FIRE !!" button to light up the night sky with pillars of burning alcohol; exited the shower to hear HACK THE PLANET echo out over the field from the stage a quarter of a mile away; saw an inflatable t-rex driving a miniature Jurassic Park jeep, played games on a hillside using lasers, and refilled the duck flume several times (shortly after exclaiming "We have a duck flume?").

...

The Cloud Is Just My Basement's Computers

I've had many different development platforms over the years - from Notepad++ on library computers in my youth, to Gentoo and then Ubuntu installed on a series of carefully-chosen laptops with working drivers, and then for the last five years or so on Surface devices via the rather wonderful Windows Subsystem for Linux (WSL).

Of course, in the WSL era I am still just running Ubuntu, but inside the pseudo-VM that is the WSL subsystem of the Windows kernel. It's honestly pretty great, and I regularly joke that I'm using Windows as the GUI layer to develop on Linux.

Between the Steam Deck and WSL both being ascendant, maybe we finally got the Year Of Linux On The Desktop, just not as we expected.

...

Life-Critical Side Projects

TLDR: I am looking for new developers and maintainers for Takahē who want to help in exchange for my mentorship, or I'll have to sunset the project.

I find it important to have hobbies that aren't the same as what I do for work, which is why an increasing number of them don't involve computers at all - I'm very happy building new things on my camper van, making weird geographic art, or hiking around bits of the Rockies.

However, I still love programming and systems work, and I'll always have at least one project going on the side that involves it - nothing beats the size and complexity of what you can create in just a few hours of coding. That said, I have two basic rules for my programming side projects:

...

I am, approximately, here

There are many questionable things about American car culture, but the road trip is not one of them. In a country as large and geographically varied as the USA, road travel is not just a necessity, but it can also be the attraction itself.

When I first moved to the USA, I had vague plans of doing some driving around and enjoying the sheer alien-ness of tiny towns in the middle of nowhere, or motels where you are somehow the only guest. Nine years in, I've done a decent amount of that, but these days my attention is more focused around the camper van that I spent half a year building.

I like to try and share a bit of the experience with those who want to see it, and as well as posting pictures and videos, I've always liked the idea of having a live map of where I am - even if it's just for friends and relatives who are interested in my progress.

...

A Takahē refactor, as a treat

I had taken two months off from developing Takahē in the run up to PyCon US; both due to pressures at work (and then, more recently, half the company being laid off around me), as well as not quite being sure what I wanted to build, exactly.

When I started the project, my main goal was to show that multi-domain support for a single ActivityPub server was possible; once I had achieved that relatively early on, I sort of fell down the default path of implementing a lightweight clone of Mastodon/Twitter.

While this was good in terms of developing out the features we needed, it always felt a bit like overhead I didn't really want; after all, if you're implementing the Mastodon API like we do, all the dedicated apps for viewing timelines and posting are always going to be better than what you ship with a server.

...

Takahē 0.7

Today is the 0.7 release of Takahē, and things are really humming along now; this release marks the point where we've built enough moderation and community features to make me happy that I can open up takahe.social to registrations, albeit with a user number cap.

We've also launched a Patreon for Takahē, in a quest to make development and operation of Takahē more sustainable - and work towards start paying some people to help out with the less exciting work like triaging tickets, user support, and moderation of takahe.social. If you want to volunteer directly, that's covered in our Contributing docs.

There's some interesting technical topics I want to dig into today, though - it's been a little while since my last blog post and ActivityPub and friends continue to surprise.

...

Understanding A Protocol

Yesterday I pushed out the 0.5.0 release of Takahē, and while there's plenty left to do, this release is somewhat of a milestone in its own right, as it essentially marks the point where I've implemented enough of ActivityPub to shift focus.

With the implementation of image posting in this release, there are now only a few things left at a protocol level that I know I'm missing:

Custom emoji (these are custom per-server and a mapping of name-to-image comes with each post)

...

Takahē 0.3.0

So, after a few weeks of development, I'm happy enough with the state of Takahē to issue its first official release - which I've chosen to number 0.3.0, because version numbers are made up and I can start where I want.

We're only releasing Docker images right now in order to try and keep the support burden down (it removes having to worry about people's OS versions and library environments), so you can find it on Docker Hub.

A screenshot of Takahē

...

Twitter, ActivityPub and The Future

Twitter is - was - such a unique place. Somewhere where you can have the President of the United States coexist with teenagers writing fan fiction; where celebrities give personal insights into their lives while government departments post memes about public safety; the place that gave us @Horse_ebooks and @dril.

The "Fediverse", with Mastodon at its helm, is not this. It doesn't seem to want to be, and I honestly think that's fine - as many thinkpieces have recently said, the age of global social media might just be over. And given the effect it's had on the world, maybe that's alright after all.

But there is still a void to fill, and as someone who enjoyed Twitter most at its "medium" size, I think the ActivityPub ecosystem is well-placed to grow into such a space. But first, I think there's some important things we have to discuss about it.

...

Every Choice Changes Everything: The Show

By Jeff Atwood

About 3 weeks ago, Leo Laporte and I recorded the first episode of what will be a new monthly show on the TWiT network. Naming things is hard, and we almost voted on the name, like we did for Stack Overflow, but we quickly landed on Off By One with

Thank You For Being a Friend

By Jeff Atwood

It's been one of those months, and by that, I mean one of the 663 months since I was born. This won't be a long post, because I only have two things to say. First, I'm really glad we re-ordered the GMI (Guaranteed

Launching The Rural Guaranteed Minimum Income Initiative

By Jeff Atwood

It's been a year since I invited Americans to join us in a pledge to Share the American Dream:

1. Support organizations you feel are effectively helping those most in need across America right now.

2. Within the next five years, also contribute public dedications

The Road Not Taken is Guaranteed Minimum Income

By Jeff Atwood

The dream is incomplete until we share it with our fellow Americans.

Let's Talk About The American Dream

By Jeff Atwood

A few months ago I wrote about what it means to stay gold — to hold on to the best parts of ourselves, our communities, and the American Dream itself. But staying gold isn’t passive. It takes work. It takes action. It takes hard conversations that ask

Stay Gold, America

By Jeff Atwood

We are at an unprecedented point in American history, and I'm concerned we may lose sight of the American Dream.

The Great Filter Comes For Us All

By Jeff Atwood

With a 13 billion year head start on evolution, why haven’t any other forms of life in the universe contacted us by now?

alt

(Arrival is a fantastic movie. Watch it, but don’t stop there – read the Story of Your Life novella it was based on

I Fight For The Users

By Jeff Atwood

If you haven’t been able to keep up with my blistering pace of one blog post per year, I don’t blame you. There’s a lot going on right now. It’s a busy time. But let’s pause and take a moment

The 2030 Self-Driving Car Bet

By Jeff Atwood

It’s my honor to announce that John Carmack and I have initiated a friendly bet of $10,000* to the 501(c)(3) charity of the winner’s choice:

By January 1st, 2030, completely autonomous self-driving cars meeting SAE J3016 level 5 will be commercially available

Updating The Single Most Influential Book of the BASIC Era

By Jeff Atwood

In a way, these two books are responsible for my entire professional career.

alt

With early computers, you didn’t boot up to a fancy schmancy desktop, or a screen full of apps you could easily poke and prod with your finger. No, those computers booted up to the command

Building a PC, Part IX: Downsizing

By Jeff Atwood

Hard to believe that I’ve had the same PC case since 2011, and my last serious upgrade was in 2015. I guess that’s yet another sign that the PC is over, because PC upgrades have gotten really boring. It took 5 years for me to muster

The Rise of the Electric Scooter

By Jeff Atwood

In an electric car, the (enormous) battery is a major part of the price. If electric car prices are decreasing, battery costs must be decreasing, because it’s not like the cost of fabricating rubber, aluminum, glass, and steel into car shapes can decline that much,

Electric Geek Transportation Systems

By Jeff Atwood

I’ve never thought of myself as a “car person.” The last new car I bought (and in fact, now that I think about it, the first new car I ever bought) was the quirky 1998 Ford Contour SVT. Since then, we bought a

An Exercise Program for the Fat Web

By Jeff Atwood

When I wrote about App-pocalypse Now in 2014, I implied the future still belonged to the web. And it does. But it’s also true that the web has changed a lot in the last 10 years, much less the last 20 or 30.

alt

Websites have

The Cloud Is Just Someone Else’s Computer

By Jeff Atwood

When we started Discourse in 2013, our server requirements were high:

I’m not talking about a cheapo shared cpanel server, either, I mean a dedicated virtual private server with those specifications.

We

October

By [email protected] (Jon North)


 For some of my friends October is Inktober a month to try artistic skills with pen and ink or indeed anything using ink that makes marks on paper.  There is a website of course - these things become highly organised on the internet - but the artistic efforts of friends young and old on Facebook are just as interesting.  And October is also a pink month - in France the proliferation of pink umbrellas in towns and cities signals the very creditable support for the fight against breast cancer - you might say 'pinktober' though this has not caught on as a label.   Plenty of beautiful roses here though at other times of the year.


Politics is inescapable.  Around Europe looming elections in various countries raise images of freedom teetering on the brink like the hut on the edge of a cliff in the Charlie Chaplin film. I keep wondering what kind of fear pushes people to vote for populist disinfor:ation, and that's without the horrors of fascist tendencies across the Atlantaic.  In France, prime ministers appointed by an increasingly beleaguered president last ever shorter times before throwing in the towel - since politics is less and less about willlingness to compromise and more and more fragmented by party solidarity  the chances of coalitions holding a stable majority are increasingly remote, and the spectre of the far right taking power hover ever closer.

I have written before about ageing.  For the moment - long may it continue  - Mary and I are both reasonably capable, but we find ourselves among friends and family who have more serious problems of health, mobility and wellbeing.   In more than one case close to us one of a couple has started to become confused to the distress of both partners a diagnosis of dementia is a broad brush for a multitude of distressing conditions.  We are all too aware both of the presures of old age creeping on and feel incredibly lucky thus far to have escaped serious illness, so we feel all the more glad to have avoided major physical or mental disabilities.  Above all we are constantly aware and think with love of our various friends and family members who have suffered or (like my younger brother Tom) are sadly no longer with us in body.  

On top of all this, increasing difficulties with mobility mean that we risk losing touch even friends fairly close by here in France.  For many years we had frequent meetings with our friends Pierre and Charles who live in the hills north west of here, in a small and beautiful old château, and have a second house in Genoa.  We have stayed with them in both places, and were at their wedding in their French  mairie a few years ago, and we played trio sonatas with them often.  Communication has become more and more difficult for them, and we miss them as we miss many other friends

My mind often turns to words, and links between English and French.   I woke up in the night recently quite worried by the links between spiders and arrest - the French for spider araingnée seems close to an  English root/synonym for arrest - arraign - but the connection is tenuous.  It took me awhile to get this out of my sleepy head and return to sleep!  Anyway, this mild autumn there are plenty of toiles d'arraignée (spiders' webs) around our house to remind us of the complexities of language - tangled webs we weave whether or not we are practising to deceive!

As always we have been reading a lot, not just current afairs which often make us feel gloomy, but revisiting favourite fictional series, including two by Alexander McCall Smith, the Botswana stories of Mma Ramotswe and those of the Scottish philosopher Isabel Dalhousie.  AMS is an amazingly prolific author quite apart from his legal texts (he helped write the legal framework for the newly independent Botswana) and the quality never dips across several quite different sets of novels.  We have also rered the Montalbano novels of Antonio Camilleri, whose stories of refugees reaching Sicily in small boats are also amazingly relevant in these Meloni times.  Both authors relish complex detective plots; the translator into English of the Camilleri books Stephen Sartarelli is also inccredibly talented.

our weekly bilingual conversation groups continue and help us stay in touch 

Recently we also revisited the tv seris of Yes minister and Yes Prime Minister, which remain quite relevant and very amusing in these topsy turvy times.  We need the light relief.  We look back with pride and sadness on the talented lives of actors like Paul Eddington and Nigel Hawthorne

Out here in the European world  so sadlly abandoned by Johnson et al we rely on good internet communication, and that is ever more difficult.  I like reading the Guardian, and have had a subscription for around 20 years.  Of course costs go up, but in addition the subscription conditions alter and it is not always easy to simply pay the extra.  new operating systems arrive and subs are linked to them, so in the worst case you have to buy a new tablet.  Or, instead of just asking for more on the next renewal you get a flash message to say  'please contribute to gain unrestricted access' - without ads - when you thought you already had it.  The same applies to The Week  which now demands a new subscription even tough it says our payments are up to date - another out-of-date operating system on the iPad no doubt.  Of course, all the time age creeps on, so we oldies have to keep up with ever more whizzy systems.  No easy answers, I guess.



Life with wine chez nous and around

By Jon North ([email protected])




Welcome new discovery of  La Clausade, a new domaine quite near us in, Mauguio, producing wines from little-known grape varieties (see below)

This is about old friends on our minds at the moment, and about a new discovery.  Those of you who have stumbled on this blog but are not particularly interested in the alcoholic liquid know that my posts are as much about friends and countryside as about the drink - our presence in France is a lot to do with our liking for wine and vineyards, and for those who run them.  And good winemakers are not just farmers or growers, not just chemists or alchemists, and not just hardworking astute business people - making wine combines all three, in all weathers.  And they are human beings who grow old so have to hand on their businesses, and they have families some of whom willingly take over from their parents but some who simply follow other paths in their lives, so that wonderful vineyards change hands, change function.

All weathers has been on our minds this summer as temperatures soar and drought begins to  affect even the deep-rooted vines.  When we came here it was a given that vineyards could act as firebreaks, but recent summers have been so dry that vines burn too.  And yields of grapes have reduced for lack of water - here in the south it is no longer sure that vines can go with out extra irrigation.

One of our favourite local vineyards, Château Grès Saint Paul, is still in business.  Its owner, Jean-Philippe Servière, is the 7th generation of his family producing wines there, he has told us he wants to retire but there is no obvious successor, and and it is not clear what the future holds, but over nearly 20  years here we have often had a warm welcome there and enjoyed many of his wines.  They are still on the shelves in our local grengrocer's

Château Aiguilloux in the Corbièeres area west of Narbonne was one of our earliest discoveries and we were pleased to call there again on our way back from a holiday  in April.  Son Georges and his wife have now taken over from his parents - we first met Georges as a restaurateur in Narbonne on his parents' recommendation, and apparently he and his wife still cater for wine-inspired events at the domaine.

Fires in the Corbièeres area were all too frequent this summer, controlled more or less by the planes we heard often passing over our house carrying water from  the seaside étangs (not my photos)


I've written often of the Chemin des Rêves which we've known for nearly 20 years, from a young family starting our in Grabels, Benoit Viot and his wife Servane have flourished as winemakers north of Montpellier, building their own home in a vineyard in the Pic Saint Loup appellation (of which he was recently président) producing also wines with the Grès de Montpellier label.  We were delighted to go back this summer with friends Judi and Alex.


The Pic Saint Loup, backdrop to the Chemin des Rêves vineyard

New wines from old grape varieties - we have discovered, via our friendly caviste (another Benoit) at O Pêcheur de Vin a new winermaker just down the road in Mauguio, called La Clausade, which specialises in wines from grapes which are disease resistant - som red, but mainly white and rosé wines from varieties I'd never heard of and which are not in any of our wine grape guides; but which are uniformly deliciious as well as unusual.  We have reordered... Muscaris, Soreli, Floreal, Souvignier gris, Artaban, names to conjure with.  It seems random to pick wine grapes for their disease resistance, but it works as well as being ecological  As always, the people who run it are added bonuses in discovering these places, and ours is becoming an area of hidden pleasures in the wine world.

A lttle further east, across the river Vidourle in the Gard, is an area, the Vaunage we often go to for meetings of our French language group (including French people trying to  improve their English as well as helping us with our pronunciation and translation.  One town/village we often visit is Calvisson, with a good winemaker theh Domaine Roc de Gachonne, whose red wine Puech du Rouge we quite frequently receive at our language group's shared lunch.  It's called multi-tasking!




A Virgo month

By [email protected] (Jon North)

Not my phhoto, but that of someone patent who waited patientlyfor the storm over the Pic Saint Loup 

I began writing a rather downbeat piece about ageing, but then stopped and changed tack. We have many friends of around our age, and some are fortunate like us, with senses more or less whole, lots of good friends near and far, partners we love and care for. I think a lot of my friends, like me, live largely on the experiences we’ve accumulated, and even if life is now restricted by pain or illness there is a wealth of memory and inner enjoyment to enjoy. I know about music and am so thankful to be able to listen, supported by the wonder of recordings. And I am endlessly grateful for the gift of sight, the ever-changing skies and light in the place we live, and the sensory pleasures of food and drink. 

This is a birthday month for us, and has been throughout my life - my grandfather, my mother, the lady I married and numerous friends all share this season of mists and mellow fruitfulness (mists not so much in our warmer climes).  It ssms also to be a month for visitors - my nephew David has just left, and a dear friend from the US will be with us soon.  The summer heat has moderated and the storms have stayed away from Lunel, but seem to have broken all around us, wiith some floods in Montpellier.  I'm reminded that when we first came on holidayto the Languedoc, almost 25 years ago, there were bad floods in Nîmes and we had to trek up and down to our holiday flat onn the stairs because a lift shaft was flooded.  It keeps suprprising me that Lunel is so dry when there are floods and storms all around.

We enjoy visiting friends and receiving them here for our regular language groups, and in the lovely warm weather just now we can sit outside.  Our reading at the moment is from books by Eric-Emmanuel Schmitt.  The ones we have read so far are related by boys born into Jewish families - one, Monsieur Ibrahim et les fleurs du Coran is about a lad abandoned by his parents and adopted by a local Muslim grocer - Moïse becomes Mohaùmed - and the one we are currently reading, l'enfant de Noé,  is about a boy who is separated from his parents to be hidden from the Nazis in a Catholic boarding school in the early 1940s .  The writing is humorous despite the difficult stories.  Both are narrated in the voices of the boys.  We have a faithful group of 20-30 people who come regularly, and an average of 15 or so in our weekly gatherings.

Of the many upsetting things in the world around us, killing innocent people by powerful weapons in Gaza and Ukraine and the complete disdain shown by many politicians for the lives of  those they are supposed to govern are open sores in the daily news.  



We think more and more of our dear friends, with whom we must now keep in touch by electronic means if nothing else is possible.   With advancin age, calm and wisdom are lurking somewhere, but on the surface are all the ailments and frailties that  beset us.  It is easy to doubt your mental capacities, (sometimes, we know, with finite symptoms of mental deterioration).  And even if you are compos mentis, it is easy to wonder and doubt.  

My own difficuulties are mainly in walking (as regular readers will know), but it's important to take care with balance and avoid falling over!  Many of our family and friends have a  variety of more or less trying difficulties, including the very distressing loss of sight  and/or hearing for musicians after a lifetime of  active performing at all levels.  Things like arthritis can interrupt other kinds of art too.  And all the infirmities bring with them increasing isolation as travelling becomes more difficult.  Moving house to better adapted premises is a good theory, but the emotional wrench of leaving a good home and neighbourhood is  huge.  I think few people have really begun to think about the  challenges of living a lot longer than our grandparents.


wonderful meal at the Maison Soubeiran last week,,complete with birthday candle from the restaurant





     



Towards September

By [email protected] (Jon North)

 

We have just heard the very sad news of our friend Clare McCarty.  She and I met through young Quakers when I was working in Friends' House in the early 1970s, and later Mary and I met her husband Norman and stayed with them in their home in Lisburn.  Clare became a leading figure in the housing sector in Northern Ireland.  At our age the death of friends is not uncommon, but to lose a friend so much younger than me is a shock.  She was one of 2 of two women friends with the distinction of receiving an OBE for her work in the crossover sector I also worked in, linking voluntary, community and statutory sectors and I feel proud to have known her.











last month's red high risk map in the Aude - Lunel is on the far right, still orange and therefore still at risk a few days ago.   The Aude area is apparently still smouldering underground
 
The very hot weather of the past months seems to be waning thank goodness, and we have had a couple of short storms, but in the very dry conditions here the risk of fires continues very high, and it is not just folk rumour that many such devastating fires (such as the one which destroyed an area the size of Paris a week or two ago) turn out ot have been started deliberately.  It is really shocking when an already dangerous situation is aggravated by such vandalism.  We read that in the UK too there are fires, in Yorkshire for example.  Hre in France, water supplies are running low - the Canal du Midi may have to close  to navigation because of lack of water.  We need more rain - only 30mm in the past two months, most of it in the past couple of days.


Over the summer months our usual conversation groups (mixed French and English people, improving our understanding of one another's languages through reading and discussions together) shrink as people go on holiday, fmaily visits etc.  So our group recently has sometimes been reduced to single figures, but those who are free still like to meet and reward our morning's work with a shared meal.

skies clearing after a noisy storm last week - most of the rain fell to the north of Lunel




Hot as hell

By [email protected] (Jon North)

From time to time - I should probably do this more often to improve my language skills - I translate articles in French media.  Here's one from this week.

Translation of article in Midi Libre 13/8/25 - interview with Stéphanie Latte Abdallah, historian and anthropologist, by Arnaud Boucomont  Now living in the Cevennes, previously in Jerusalem, she has a harsh view of the strategy pursued in Gaza by the Netenyahu government, which requires an active response.

Do you think total occupation of Gaza by the Israeli army is feasible?

That would be complicated, although it has long been its public aim, staying in and recolonising Gaza. We've heard that for ages; the commander-in-chief of the army has said that clearly to politicians but the message has not been heard. It would take a huge number of men in the longer term, and the army is relatively fatigued with many reservists refusing to serve there. The Israeli army is faced by an ongoing guerilla war by Hamas. Gaza is pretty well destroyed but Hamas' capacity to act is not completely exhausted.

What's your view of the attitude of the international community, France in particular, over the past two years?

The recognition of the Palestinian state is long overdue, but there is an interest in isolating the current Israeli government over its refusal to recognise a Palestinian state. If Britain joins France as it has promised then the USA will be the only state in the UN Security Council not to recognise it. In the proposals publicised so farthere are no means of enforcing the proposals. There should be sanctions, and suspension of the accord of co-operation between the EU and Israel. But that would be to act without acknowledging the current genocide, without naming it as such. Because if it were named the countries involved could be even seen as complicit in the genocide because of their inaction.

What about the growing famine in Gaza?

There will be severe consequences for children, older people and those with chronic illnesses. In the long term I call that 'futuricide', resulting in killing as many people as possible. More than 61,000 have died directly as a result, but the lack of healthcare, chronic sickness, famine, land poisoned by armaments, pollution, lack of refuse collection and of cleaning services brings the total up to around 200,000 people.

How would you sum up the policy of Netenyahu over the past two years?

He was always against a Palestinian state. There is a fragile coalition between supremacist and pro-colonisation ministers and deputies and those in favour of annexation of the West Bank and the re-colonisation of Gaza. They claim to be following the biblical principles. Netenyahu himself is not especially religious but uses this language to build up support for his project. He has stayed in power by enlisting the most extremist members of his government who guarantee his position. He hopes to keep tension up by occupying as much territory as possible. He tries to avoid political scrutiny.

How do you view the religious aspects of the conflict?

On the Israeli side we can see the co-option of a religious-sounding language through the idea of a battle with Amalek, the old testament enemy of Israel, each side trying to destroy the other. In the Bible it was seen as necessary to destroy Amalek completely. In a March 2025 study by Penn State University, 82% of Israelis were in favour of moving all Palestinians out of Gaza.

In the other camp, obviously there are the islamist groups like Hamas and jihadists who fight in Gaza using islamist language. There are also other groups which are mainly secular. Within the Palestinian population religious motives are not so much to the fore.

The typical Palestinian who finds her/himself being bombed, losing children, how can that do other than generate hate or antisemitism?

Speculating on such emotions takes us beyond the realm of rational analysis But Palestinians distinguish clearly between Israeli policy and jews. the question of antisemitism as seen from France does not arise in the same way in Israel or Palestine.  

So how do you see this conflict being played out in France?

Generally we've seen a gradual change in public perception over the past two years. People were quite virulent in their views to start with, not wanting to see what was actually happening, that the Israeli government really wanted to destroy Gaza, but things are changing. Better late than never. For France, which has long supported the State of Israel, it's complicated. It is difficult to tell yourself that Israeli governments are committing genocide when that very state grew out of genocide suffered by Jewish people.

What about the strategy of Hamas?

At the time of the 7 October outrage Hamas' objective was to make sure Palestine was not forgotten in the signing of the Accords of Abraham which foresaw making peace without taking account of the Palestinian question. They also wanted to avoid the annexation of the West Bank and demonstrations in front of mosques.

They could have reacted differently!

From what they've said, some things got away from them. They do not accept that they intended to target civilians. They claimed that other groups had infiltrated theirs. But there were certainly abuses and war crimes by several groups, of course including Hamas.

All the same, the strategy involved murders and taking hostages…

Hostages certainly. They wanted to exchange them for Palestinian prisoners, using them as a kind of exchange currency to protect themselves. They ahd also decided to push the Israeli army to the Gaza border to break the siege. They see themselves as being involved in a war of resistance. I'm just saying how they see things - I'm not saying I agree with them.

Nostalgia

By [email protected] (Jon North)

Another year of the Tour de France has ended with a week of the women's race across the middle of France, emphatically won by Pauline Ferrand-Prévot.  But one of the highlights was the emergence of Maëva Squiban who won two of the penultimate stages in the mountains.  She will be one to watch.  Sadly our ability to see the Spanish grand tour, the Vuelta, willl be very limited.  We really must sort out access to tv channels.

The men's Tour finished for this  year in spectacular fashion.  Wout van Aert won on the Champs Elysées with the overall Tour winner Tadej Pogačar a few seconds behind.  The novelty this year was the addition of three ascents of Montmartre to the Sacré Coeur to the usual flat-out sprint round and round the Champs Elysées.  To my mind the change was excellent, adding excitement on the last day.  Wout deserved his final accolade - he had planned the attack on the final ascent - and seeing the final circuits happening on the cobbles, in the rain, was dramatic and without mishap.  

Amusingly Van Aert had earlier openly criticised the change in the final day, saying it was too dangerous.  He had the last laugh (or perhaps it was a cunning double bluff), and I'm fairly certain the new routine will stay - better than the old procesion with added sprinters (sorrry Cav).  I know there are those of my friends who find our interest in sport tedious,, but there we are.  It also applies to cricket (which we sadly can no longer watch) - in fact at least one friend I can think of can stand neither cricket nor cycling.  Sorry again!  But the women's race proved quite absorbing and came up with several top French contenders, which guarantees a French tv exposure.  Although women's cycling is advancing by leaps and bounds, not yet a level playing field.

slower creatures

A friend has just recalled a time in our lives when he and I lost touch.  Happly, we both feel, despite often living in different places, countries even, we have restored and stayed in contact since.  And there are ever more gaps in our circle as we age.  But we are so glad to remember those still with us even if we can seldom meet face to face.  This blog serves to keep some in contact, and despite its notorious replutation Facebook is still for us a valuable way of keeping in touch with old friends and newer ones.  The warmth of memories fills a lot of gaps when we can no longer travel so much.

The non-exhaustive list of people no longer physically with us include friends and Friends we made in France.  In the small Quaker community of Congénies were Dennis Tomlin and Brian Painter; others important in our lives here included Marcel and Michèle Bombart and neighbours in Lunel Michel Cazanave and Mme Picard. Quakers back in the UK were (among many others) Polly Tatum (an honorary Friend in my mind) and her husband Arlo, Arthur White, Geoffrey Bowes, Ted Milligan and  Malcolm Thomas.  Apart from my parents and Mary's mum, family members now no longer with  us include my brother Tom, my aunt Ida (who travelled with us memorably more than once in France) and Sam's father-in-law Taeke Oosterwoud.


My ex-boss Ted Milligan centre stage at our wedding reception in 1978
A complete album of our wedding photos is here

We have just re-established our car insurance.  The car is a lifeline now mainly for local travel, but above all for two things - for Mary to enjoy her cello outings, and for both of us to go to twice-weekly language groups which meet in various people's homes (including ours).  The summer has put a pause to all that, and I can well understand that she does not want to practise until the hot weather has passed.  Anyway, the car insurance would have lapsed next January for silly bureaucratic reasons, and we have to pay more (naturally!) for the replacement, but it is worth it.

Like another friend who has been sifting and disposing of huge piles of old papers, indeed like everyone until a few years ago, we have a life that used to be defined by files of papers but is now rapidly being encrypted in bits and bytes on electronic devices.  We have just re-sorted the paper files that still line our office, and finally tracked down various folders we thought lost.  And of course, 85% of the paper is no longer useful; the other  15% is probably useful but we may never get round to sorting it out.  So now we are continuing the endless process of chucking out old files into recycling - once the office is more or  less up to date I have started to excavate the roof where layers of dust need to be tackled too.  But it is frightening to find how soon things that I labelled clearly as current are just more unwanted archives.  As for the electronic things, the identifiers that work are fine, but once a chanin is broken oneis reduced to scurring between devices to confirm that I am me and getting in a fog of confusion when a password no  longer works.


Outside the August sunshine is just beautiful and the evening skies often breathtaking.  There have to be ways of setting aside the humdrum, confusing processes of admin, all the more when the old expedient of going for a walk (which Mary still enjoys) is slower and more laborious.

Reading still occupies a lot of our time.  Mary is a regular reader of books in French, often borrowed from the local library which has been one of several useful developments in our neighbourhood.  They sometimes have interesting short afternoon lectures.  I read a lot though mostly in English.  We are both re-reading series of novels we've enjoyed and enjoy still - Mary is nearly up-to-date with the Bertie books by Alexander McCall  Smith, and I am well into the Montalbano detective books by Andrea Camilleri, beautifully translated by Stephen Sartarelli.  We shall revisit the tv series over the winter I expect.  It is good to read paper books at least some of the time, even if some are far too heavy and cumbersome to take to bed and the Kindle is a welcome and more flexible alternative.

The hot weather is back this month.  There have been several severe fires in the countryside east and west of us, and the sound of the Canadair planes passing over us has been more frequent in July - they scoop water up from the étangs near the coast then drop it on the fires in the garrigue north of us.  Not too near where we live, but very worrying all the same.


This blog should have mentioned food more often than it has.  As much as wine, we enjoy our food and relish the local produce, particularly fresh fruit and veg, together with herbs and spices.

The salt pans at Aigues Mortes - pink colour due to algae in the water

But salt is both local and important.  Interestingly the articles about French salt on the internet are almost all about the Guérande and other places in the north and west of France.  But here it is the salt production of the Camargue, and in particular of the salines of Aigues Mortes, which is most prominent.  The names Aigues Vives and Aigues Mortes are both local place names - 'alive' and 'dead' water, fresh and salt water in other words.  And Aigues Mortes is a local centre for the production of salt.  The fleur de sel which we use at the table is the relatively small quantity of flaky salt which is left on the surface when the water eveporates.  Of course, salt is essentially sodium  chloride, but the fleur is a little diffferent because the evaporation leaves higher quantitites of minerals like magnesium - it is prized by chefs and a lot more expensive than the table salt we use in cooking and so  on.

Now into August, and we are looking forward to visitors in a few weeks' time when I guess the heatwaves may have subsided.  Lorry fires on the motorway are a regular part of the news.

To all our friends and relations, enjoy the rest of the summer.



Into the Pyrenees (them, not us!) and on to the Alps

By [email protected] (Jon North)

We have been scanning our wedding pics from 1978

The Tour continued after the first rest day, and some minor surprises like Pgačar falling off without much prompting in a fairly flat part of the race near Toulouse, some rather caustic comments about other competitors waiting for him  (no skin off their noses I think although some off his legs) and several riders sharing the glory, including a nice Irishman Ben Healy who stayed in the yellow jersey for 2 days.  I'm sorry when being sporting becomes a dirty concept, like today's politics really.  

At the end of Thursday's first Pyrenees stage normal service had, in a sense, been resumed - Pogačar back in yellow after a typical and jaw-dropping ride up the final steep climb.  OK, he may be using unfair magic, but if so Vingegaard and those behind have somehow missed out on the trick.  Actually I am (we are)  excited and awed by the compact power he shows,   As I write the next rest day is approaching, and they are heading for Carcassonne.   The race passes through Revel, an area we know well because our friend Barry, of whom I've written before, lives near there.  Next week to the east and other places we know well from our earlier twinning excursions.

There is a lot of yellow around during the Tour - my wine mag got into the act

The local paper meanshile is fairly typical of local French opinion, bemoaning lack of French winners of late - "Les Bleus plutôt pâles"  - French sports teams commonly known as les bleus and pale blue being, well, pale.

When the Tour reaches Paris, this year instead of just circling the Champs Elysées the race will add in two climbs towards Montmartre and the Sacré Coeur.  Wout Van Aert (who seems to be the official complainer in the peleton - he has just also objected to retaining sprinters who are too slow up hills) thinks it is dangerous.  So are a lot of things that happen in bike racing.  Anyway, sports rules are by definition arbitrary.

Memories of many no longer with us - our parents and my brother Tom, Ruth and Heinz Liebrecht, Malcolm Thomas.  Good people to remember and there are those of you who are still alive, happily.

Others who were at the wedding are sadly no longer with us - Ted Milligan, Polly & Arlo Tatum, and others.  We miss them all but are so glad of the memories they leave.  More photos in a future blog.

Meanwhile, back in the tedious world of admin, we have to keep proving we are still alive and entitled to pensions.  There are at least three different systems demanded by different pension providers, all of them complicated by the fact that English people do not recognise French, nor the French English.  It can all be got round, but it always seems an anxious moment for us.






Fires all round

By [email protected] (Jon North)


The hot dry weather and mistral (strong northerly wind - sometimes it it is north-westerly, coming over the Black mountains and called the tramontane) all combine to make the countryside like tinder, and this week we have had fires to the west of us north  of Narbonne, along the A9 motorway, and to the  east in the hills above Marseille.  The immediate causes are often unclear, but can arise from human idiocy.  One person was reported to have been towing a lighted barbecue on a trailer!  With the Fête National coming up, fireworks are planned everywhere despite the risks.  Climate change denial?

Our enjoyment of the Tour is undiminnished - Pogačar back in the lead and some fiarly flat stages this weekend.  The local paper had a good article on what some people call mechanical doping, and I have summarised this iin English in case it interests anyone.  "Looking for motors.   In a former life Nick Raudenski hunted terrorists.  Today he hunts motors in the bicycles of the Tour de France.  The American is now in charge of the fight against technological fraud at the UCI (Union Cycliste Internationale).  "When I arrived the first thing I tried to do was to put myself in the mind of a cheat.   How could I use a motor without being caught by the inspection patrols?  I worked in antiterrorism.     An idiot tried to blow up an aeroplane with a bomb in his shoe and now everyone has to take off their shoes at the airport.  The same thing in cycling"

Although technological fraud is often cited, only one case (in 2016) has been proved in the world of professional cycling, the 19-year-old Belgian Femke van den Driesse used a hidden motor in the world cyclo-cross trials.  Since then millions of checks have been carried out without finding anything.  "Why has nothing been found?   This really bugs me.  My job is get to  the bottom of it."  In the 2024 Tour 192 bikes were x-rayed, always including those of the stage winner each day and the yellow jersey holder, 17% more than in 2023.  "This year there will be even more" says the UCI, which is also running a programme of financial and other incentives to encourage those who provide useful intelligence.

In June in Combloux at the Criterium du Dauphiné,  Raudenski demonstrated the checks he carries out at the finish line where he intercepts riders, and on to the tent just behind the podium where bikes are taken apart and examined - "at the beginning of each stage the commissaires check bikes with the help of magnetic scanners.  They can alert us by phone if they notice anything suspicious.  Nick and his team have portable x-ray machines round their necks, checking machines from top to bottom.   "These meters are so good they can see the serial numbers of cables, eveything going on inside a bicycle. ...we know exactly what we' re looking for."  

Raudenski and his team keep up with the latest technology, comparing it with what happens in other sports like Formula 1, for example smaller and smaller batteries like those used to power drones - there has been enormous progress in these technologies in recent years.  Nick is very confident in the effectiveness of the tests and checks despite the doubt cast on the UCI's capacity from time to time.  "I really want people to believe, when they see an amazing climb or an explosive attack that they are seeing something genunie, not saying 'oh, they're using a motor'. As for the suspicion that the UCI covers things up so as not to damage the image of the sport, he is categorical "that's out of the question.  whatever may have happened in the past, that is not my style.  If we find something, we'll  make sure it is heard loud and clear."

The race is not just about winners, but those who make exceptional efforts.  Yesterday there were unusually two sharing the combativity prize: "The race jury came to a rare and exceptional decision. On stage eight of the Tour de France, there would be not one, but two winners of the combativity award: TotalEnergies pair Mattéo Vercher and Mathieu Burgaudeau.  The French duo broke away from the peloton with 80km to go into Laval. It was a day billed for the sprinters, and while everyone else resigned themselves to that fact, Vercher and Burgaudeau dared to believe a different result was possible. Team-mates in unison, their white jerseys transparent with sweat, they took off away from the bunch, and ploughed in tandem through the countryside of western France for an hour and a half.

The effort, in the end, was fruitless; both were swallowed by the peloton, and Lidl-Trek’s Jonathan Milan won the bunch sprint. It was, however, a historic occasion – only the fourth time in the Tour's history that the combativity award was shared.

The Tour - yet more cycling

By [email protected] (Jon North)


The canicule (heatwave) continues although the early mornings and late evenings are pleasantly less hot.  We have moved our sleeping quarters downstairs.  Interestingly our hugely improved roof insulation has meant that the nights upstairs are much warmer because the heat from the roof slowly seeps out then. 

This month will be taken up for us watching the cycling.  Cyclists of course have to plough on through the hottest weather, and it has been settled over a lot of France these past few days.

These 2 are well in evidence even at this early stage of the race

The first edition of the Tour de France was in 1903.  Since then much has happened - our local paper  has published a nice leaflet to mark the links between the race and our region, involved in a third of all the stages this year.  Names and events to conjour with - Laurent Jalabert, a successful competitor now a constant presence in the tv commentary team, competitors like the Colombian Nairo Quintana, key places like the rose city of Toulouse which is the jumping-off point for the Pyrenees and our local city of Montpellier which will host a rest day  this year,

Cheating is back in the newspapers, though without much hard news I can see, just the suspicions that often go with a gloomy feeling in France that French riders are not doing too well.  Apart from the hard cases like Armstrong it all comes down to the gut feeling that being that good is improbable.  Apart from using illegal substances and 'doping' machines (essentially hidden motors), the permitted changes in machinery and nutrition are enough to make huge changes in performances, and watching the ssecond stage today got me thinking, not just about changes in equipment and nutrition but about the huge infrastructure of support people, cars following every team with spare bikes and young blokes rushing to replace faulty bikes.  At any given point it must have been difficult to decide shat sas legal, and who had an unfair advantage.

Bikes have changed from steel and aluminium to carbon fibre, with disc brakes, electronic gear changes and many more derailleur gears, controls all electronic and sometimes using bluetooth, tyres filled with self-sealing liquid and no inner tube.  Over the years there have been frequent rumours about mechanical doping, with little hard evidence of cheating, but the mechanical advantages of new equipment have made a huge difference  to  the lightness and potential speed of the bikes.  Nutrition has also changed, both the science and the materials - careful  calculation of energy needs, fluids and gels easily carried and absorbed, calculated not just for the trrain but adapted to the needs of individual riders, with timing of a what to eat and when.


Away from cycling, Language is changing and not, for me, for the better.  The words batter (in cricket - formerly a cooking ingredient for pancakes and yorkshire pudding) and train station (which we always used to call a railway station) are now accepted terms.  Not sure why batsman was no longer acceptable for a male cricketer, although the female of the species did and doesneed a separate term.  But things move on, and I do accept that since long before Shakespeare the English language was and is living.


Hot, hot, hot

By [email protected] (Jon North)

It has been over 40° in the afternoon these last few days.  A British friend who has lived in the tropics sent some useful  tips - "In the middle of the night...open up all windows and even doors if it is safe security wise to do so to get the coolest air of the day circulating throughout your property. That should reduce internal heat to whatever the lowest overnight temperature was.  Then when things start to rise... close all windows and doors and draw all curtains. And keep them that way if you can throughout the day. Inside should then stay much cooler than outside.  The mistake folks make here in UK is that the hotter it gets the more they open windows during the day 'to get a breeze'. Well that breeze is as hot as outside temperature so it quickly brings inside up to outside."  Languedoc temps are less trying before mid-morning, and here we don't have curtains, but the principles stand.  I would add, from my O level physics, that keeping cool can be aided bynot drying oneself too thoroughly after a shower - 'evaporation causes cooling'.  The fans we bought last week also help.

There is now a red heat warning across part of France.  We shall not be going to our French groups this Tuesday - some people still want to meet, but driving to places would be a problem, and driving back more so for us and others who are approaching their 80s.  Having airconn in a house is one thing, but going back to a roasting car quite another.

our language groups have shrunk a lot in the summer heat,
but Danielle stilll helps those who remain!

One sad background to our afternoons is the sound of Canadair planes flying over on the way to fires to dump bellyfuls of water.  It hppens every dry summer, but I'm guessing this year will be the worst yet.  Mary read of one fire started someone towingn a lighted barbecue which shed lethal sparks along the roadside.

The mayor of Lunel, Pierre Soujol,  has died.  Very sad news - he seems to have done a lot of good things for the town.  

Mary has just set off down the garden to feed the 2 larger tortoises.  Their appetite for lettuce is undiminished.

I am collecting examples of autocorrect misfires and silly mistypes:


our son and daughter-in-law have been in Brittany
but are unlikely to have encountered  such onion-sellers.

I've just read bad news about champagne production: "The conditions endured by grape pickers in the Champagne region of France have been put under the spotlight by a human-trafficking trial that began in Reims last week. Svetlana Goumina, the Kyrgyz owner of a recruitment agency, is accused of luring 57 West African migrants, most reportedly undocumented, to the region from Paris, on the promise of well-paid work." The latest in a catalogue of mistreatement of seasonal agricultural workers; as often, I refer back to fictional parallels such as the excellent book A Short History of Tractors in Ukrainian, by Marina Lewycka (strawberry pickers are the victims in this case).

A joke which I hope does not offend anyone: "A Texas farmer went on vacation to Australia. He met up with an Australian farmer who proudly showed off his wheat field.   "That's nothing" said the Texan. "Back home, we have wheat fields that are twice as large as this."   Next the Australian pointed out his cattle.  "They're nothing," said the Texan. "Back home, we have longhorns that are twice as big as your cows."  Just then, half a dozen kangaroos bounded across the road.  "What are those?" asked the Texan.
The Australian replied, "Don't you have grasshoppers in Texas?"

Our newly surfaced road - not sadly our own cul-de sac de la Bréchette, which is long-neglected


...and finally the annual delight of our artichoke coming into flower







More on cycling

By [email protected] (Jon North)

Following my previous short post on cycling, I've been thinking about  my own long association with bikes.  I learnt to ride before the age of 10 on the large lawn of a friend in Chesham.  Soon after I had my first crash, setting out confidently down the steep hill from our gate and failing to judge the turn into the road just opposite.  Collision with curb, probably a grazed knee but it did not stop me for long.  Soon after I was going for rides with my dad, one of the few things we did together; we both had sit-up-and-beg bikes with rod brakes.

In my teens both at home and at boarding school I had a jazzy yellow 'racing' bike with 5-speed dérailleur (we pronounced it di-raill-ear or something - I only more recently learnt the French signification).  My main memory of those days is of the several journeys I made to and from boarding school to home, from Saffron Walden (via Royston, Baldock and a stop for refreshment around Hitchin), around 60 miles (83 km in new money).  For several years in my teens  I went for Sunday afternoon bike rides around the Essex coutnryside - Thaxted, Audley End  and other local places.  But those rides between home and school were the longest I tried - it amazes me now that I could do this.  But I enjoyed my cycling days until only a few years ago when I fell off rather more than I liked, and sold my nice 10 speed touring bike to a local contact in Lunel.  I do still miss it, and am tempted to buy a 3-wheeler with some motor assistance - we'll see once complex analysis of knee arthritis has ground on a bit.  I had an x-ray in a hi-tech scanner tunnel, complete with an array of whirrs and growls, in a virtually deserted outpatients clinic yesterday - a far cry from the old simple x-rays I had for my first knee replacement about 10 years ago.

The Criterium du Dauphiné which we've just watched on French tv is soon to be rechristened the Tour Auvergne-Rhône-Alpes which, a friend points out, does not trip off the tongue but does more accurately describe the routes from central France south-east towards and up into the high Alps.  It is, in any case, a major event in the run-up to the Tour de France now only a fortnight or so away and, like the Tour, reliably shown on French tv.  There are three or four good reasons to watch these daily broadcasts - it helps to improve our French by listening to the high-speed rattling of commentators; it gives the best view of the main Tour contenders; and the views and scenery are magnificent.  As with other French tv, the use of aerial photography is something that you can't get at ground level, just as the following of a whole race using other vehicles gives a completely different perspective than you could get standing by the roadside.  But shoals of folllwing cars bring their own hazards on narrow roads.

The French love of cycling racingis largely if not exclusively linked to the participation of French riders who very rarely win whole races (the Criterium is over 8 days, the Tour covers 3 weeks), but who quite frequently win stages in the classics.  This summer sees the retirement of  one icon of French cycling, Romain Bardet as another young hopeful, Paul Seixas edges into the top ten.  Bardet had a guard of honour of upended  bikes on his final appearance in the Dauphiné.  We are always pleased and amused to see and hear Thomas Voeckler, a previous French legend, ex-yellow jersey in the Tour, now commentating from the back of an accompanying motorbike.

The dubious example of Lance Armstrong, bang to rights for taking drugs after many years dominating the Tour, is in everyone's minds.  (He is now being rehabilitated, in a way, by people who cite his help for others recovering from drug misuse.  I'm not sure about that).  Seeing Pogačar winning often raises questions in some minds despite all the efforts made these days to test for doping.  Interestingly there is relatively little suspicion expressed in the French press about him - I prefer to  go by the usual fair view 'innocent till proved guilty'.  But there is also the question of doping bikes - that is, hidden motor assistance in racing bikes.  In our everyday lives we have friends who use electrically assisted pedal bikes, but the motors to be any use have to be more bulky than would work or be invisible on a pared down racing bike.  In any case, among competitors to win at the highest level, surely everyone must be doing it if anyone is.

One thing that always strikes me is  the lack of protection cyclists have from injury - they are skinny beings, and can use virtually no  padding, only head protection, yet you often see them fall, get up with horrible looking scrapes and get back on to  try and lose as little time as possble.

More interesting is the question of how competition pans out in the top ehelons of the international cycling world.  When Pogačar and Vingegaard are in a stage race, few others stand much chance; when they are not involved Roglič (really from the previous  generation of Slovenian cyclists, and having taken up cycling after a skiing accident) comes to the fore, and in less prestigious races other cyclists emerge from the péloton  to win - and so  on all the way down the pecking order.



Anyway, now we look forward to the Tour soon.  It is coming by Montpellier but not, I think, very near us unlike the two years soon after we arrived when it passed by  the end of our road.  They will be going up Montmartre on the last day in Paris, a thing some riders think is risky but will certainly add variety to the sprint round the circuit of the Champs Elysées










Cycling in the summer sunshine

By [email protected] (Jon North)

A short post this week.  The cycling season is with us (for us two, strictly as tele-spectators) - there have already been major internationsl races, but the Criterium du Dauphiné is the first of the year in France where the major contenders for the Tour de France  all show up.  This week the weather is getting warmer, and it's dry, so the scenery is a real pleasure in the early summer sunshine.  Geographically the Dauphiné is the mountainous region around our old twin area, the Diois, but the race spreads its route a long way to the north.  By the fourth day as I write it has more or less reached Valence passing through the rolling countryside of central France.  Mid-week we'll have the time trial, and then three tough mountain stages to finish thte week

The first days have gone more or less as expected - Pogačar, Vingegaard and assorted Dutch and Belgian riders up the leader board, the right mix of French riders near the top to keep the local interest up, though never quite strong enough to get right up there.  Over the first three days the lead changed, but we'll see by the end of the week when the mountains take their toll.  Meanwhile the scenery is a joy to watch as always in televised cycle races.  It is a shame the riders do not see it, especially (they say) because racing has speeded up so there is no time to admire views.  The normal speed on the flat is faster than a town speed limit for motors.

Thhis past week has seen the start of resurfacing work on the D24 road past our little cul-de-sac.  Slow work made even more sluggish by the bank hoidays that litter the month of May.  But for all the anxiety it provokes for me, the reality is that scarcely  anything seems to be happening.  Pictures of the preparations and improvided parking follow.


Having started talking about cyclists like Pogačar I needed a č, but the special ALT+ 0269 code I tried did not work (it is simple on the iPad) so I had to cut and paste it from a website!  The petty trials of modern life!  

Living in one place, citizen of other

By [email protected] (Jon North)

The wonderful flowers of the ornamental grenadier (pomegranate) whose hedge blooms year on year 




Old news for most of you, when we moved to France we were citizens of the EU  Now, thanks to what most people now see was a political  mis-step, the UK is well and truly Brexited  The rather mealy-mouthed stance taken by the so-called Labour government led by Keir Starmer is to try and  creep back in without too many people noticing.  Politics in like that, compromising in plain sight, watering down principles on the way.  So capping and removing welfare benefits is dressed up as financial prudence and the poorest people struggle more while better-off people like us are cushioned at every turn.  


I have recently sent in our French tax return for 2024 (calendar years here which have to be jiggled into line with British April to March financial years, since we receive our pensions from the UK.  I am always nervous about this, but generally there's no need provided the formulae on my spreadsheet are entered correctly, but one by-product of the cross-checking I always do to be sure is that year by year the gap  between Mary's income and mine shrinks - the bulk of my pension comes from a fixed-sum pot, while Mary and I both have British OAPs which are triple-locked so go up by more than the rate of inflation.  It would take a long while for her income to approach mine, but it is getting nearer every year.


This year we have been more than usually anxious about money, because we rely on our Brtish bank accounts for everyday purchases, and every now and then there is a glitch when someone elsewhere in the world decides to steal money from us.  Luckily our banks are on the lookout for this and twice (once on a French account, another on a UK one) we have had to cancel cards and wait  for new ones to come.  Last time the swindlers actually got their hands on a lot of money, but the French bank refunded it quickly.  This week we received a letter asking us to phone the bank, and then had to go through the meticulous checks to get through to a real person.  This one was in India or similar, and of course you always have to remain calm despite the feeling of advancing panic.  But all's well that ends well.  We keep reminding ourselves that the people who work in the call centres have tough jobs,  are not to blame for the processes they have to operate and have little room for discretion.

I am writing having just been out successfully to buy fans which we hope will moderate the heat to come.  For the last several years we have been too late, none left in shops, but this year we found what we wanted.   Many others we know have air conditioned houses, but we have decided not to go  down that road - like swimming pools which many friends have, we realise that they are expensive and troublesome luxuries - now, with my legs being as they are, even geting out of a pool would be tricky and I have taken to having shower rather than even an occasional bath.

a nearly deserted town centre after a visit to the local museum 

Even more than the excesses of Trump, my mind has been occupied with the excesses of the Israeli government.  More than ever, I find it impossible to relate its obscene actions in any way to the presence or absence of antisemitism, and I know many Jewish friends feel the  same.   I think the world is anaesthetising itself to destroying human life, easier and easier as the technology makes the distance between atacker and attacked ever greater, and the chances of innocent loss of life likewise.

As we approached a beautiful sunny weekend I was stranded at home while M is equally left in the lurch, waiting for the breakdown after our car locked her out. We have had a succession of mishaps with the car (two punctures, then this) which makes us all too aware how dependent we are on the car.  It is only a question of waiting, but as we both suffer from age and infirmity  I am seriously thinking of a second vehicle.  This is very unecological but we could afford it.  In the end it turned out some tiny ball-bearings had got trapped in the ignition keyhole.

On top of that, the main road to our house is to be closed for resurfacing for the next fortnight.  There are ways round it,  and the whole hting has been well signalled, but with our luck the visitors we expect next week may have problems.

Two bits of cheer this weekend - Simon Yates did an amazing ride uphill on a gravel track to overtake the then leader of the Giro d'Italia and effectively winning the multi-stage race.  And today thanks to the BBC still available here we can hear one of our favourite pianists Angela Hewitt interviewed.  

poppy time here - usually en masse in fields, but this one outside our front gate!





Longer days

By [email protected] (Jon North)

A headline in the local paper (mid-May) says there is a shrinking number of readers of books in France - according to the survey organisation Ipsos 63% of French people read fewer than 5 books a year.  In this house we do our best to keep the numbers up, but although Mary is a loyal visitor to our local library my reading is almost all on electronic devices and I'm not sure how that is included in the statistics.  Whatever, we in this house read a lot - a silent house more often means we are reading than absent.  We are, as they say, big readers, I mainly in English, Mary now mainly in French.  I do admire this, but I would be too slow if I tried, always stoppping to look up  words.  But we read in French in a group twice a week, with native French support, and are currently working through a history of Algeria and a translation of Alan Bennett's The lady in the van, very different and both very enjoyable though the history of the French in Algeria is much less cheerful.

My diary, and from time to time this blog, have frequently focused on my leg pain - three overlapping phenomena, arthritis, sciatica and (oh dear) gout as well as general aches and pains that the French lump together as courbatures.  Gout is, of course,  a result of drinking alcohol.  Well, it is avoidable but I ask myself how being a wine-lover is compatible with avoiding it.  So, moderation in all things, but it shows on my frequent blood tests so my doctor is 'aware' - he often mentions the uric acid but seldom directly talks about drinking less.  However, I have been presecribed a kind of trolley I can walk with and rest on if necessary.  Unfortunately so far it is not much good for me - I prefer to continue with my stick.

  


This had long since ceased to surprise me, since French culture and wine are intimately bound up with wine my present doctor refers to the subject obliquely via the annual reports from the blood lab - our previous doctor, now retired, did not mention it at all, adhering probably to an old French culture in which drinking wine was more commonplace.  In the UK medics often talk about drinking too much.  Someone gave me a book (in French so I am  only slowly reading it) about alcohol at the time of the French Revolution, before which it was apparently only consumed by people of a certain (upper) class.  So not at all commonplace until the 19th century,  and now 200 years later, the press is full of reports of declining wine consumption.

My leg pain has intensified, and tests and treatments are on the horizon.  I have become a very slow walker although I can still manage, and luckily I can still drive so things will be easier once I can pick my way through the French bureaucracy to  get preferential parking.  Most of the treatment I use at present is in the shape of pills relieveing pain, but a treatment I use daily now which is non-chemical is TENS - the French use the English phrase, abbreviated from Transcutaneous Electrical Nerve Stimulation

We have just revisited a restaurant,  La Maison Soubeiran in Lunel, which is becoming one of our favourite places to eat - a small family business, friendly with beautiful  food.  The walls are decorated with photos of Jane Birkin and Serge Gainsbourg.



Although this post is mostly about current things, I'll add one other thing.  Since we visited Armenia a few year ago we have been interested in the country, so I picked this up  from the European Correspondent newsletter this month and thought it worth repeating:

How Armenia is becoming the region's only democracysort of (by Nerses Hovsepyan)
In 2018, Armenians pulled off something rare: a peaceful overthrow of a corrupt government. What started as street protests led by ordinary citizens grew into a movement that toppled Serzh Sargsyan's long-standing regime. Since then, the country has taken small but important steps toward democracy.  Elections aren't guaranteed to favour the ruling party, opposition leaders aren't silenced, and media outlets have more freedom than ever before. This might not seem remarkable to the average European, but in a region where autocratic rule has been the norm for decades, Armenia's gradual shift is a noteworthy exception. 
In Azerbaijan, elections are largely a formality, and Iran, well, is Iran. In Türkiye, the government regularly throws opposition politicians into prison, along with journalists and protesters. Meanwhile, Georgia, once the democratic leader of the region, has been sliding toward authoritarianism (which you already know if you've been reading us). To illustrate this: Georgia's press freedom ranking fell from 60th to 103rd since 2013, while Armenia's improved from 102nd to 50th in the same period.  Before 2018, Armenia appeared locked into an authoritarian trajectory similar to its neighbours, with Russia influencing every aspect of its economy and politics: Moscow controlled 95% of its foreign trade, all major infrastructure, and even its border security. 
The Velvet Revolution didn't just topple a corrupt government; it began unravelling this decades-old dependence. Today, while still formally allied with Russia through the CSTO, Armenia has frozen its participation in the bloc and is actively but carefully pursuing an EU membership application – a geopolitical reorientation unimaginable before 2018.  The largely peaceful 2018 Revolution began because Armenians were fed up with a corrupt regime that had hijacked Armenia's democratic promise while tightening Moscow's grip on the country. It was led by Nikol Pashinyan, who has been prime minister ever since, and was dubbed 'velvet' in reference to the nonviolent 1989 Czechoslovak Velvet Revolution. 
Seven years after the revolution's euphoric promise, Armenia's democracy remains a work in progress. Yes, Armenia has seen peaceful power transfers, and opposition parties can now operate more freely. But the country still faces serious challenges.  The judicial system is slow to reform and remains deeply mistrusted. Media outlets, while less restricted, are still influenced by political and business interests. LGBT+ rights remain a thorny issue – queer events are frequently canceled under threats, and hate crimes often go unpunished.  For Armenia's fragile democracy to survive and grow, it needs sustained support – financial, diplomatic, and, given its security challenges, military – especially from the European Union. With authoritarianism tightening its grip across the region, from Azerbaijan's iron-fisted rule to Georgia's democratic backsliding, the threat of Armenia slipping backwards is all too real.
Our one trip to Armenia and Georgia was several years ago now and a plan to revisit with friends was stymied by Covid.  Now Mary and I have more or less decided not to fly again (our friends still travel a lot: they like others we know here are originally from other parts of the world and so have diverse reasons for wanting, needing to fly).

All 3 tortoises are thriving after hibernation for the 2 older ones - the little one still lives indoors!


20 years in the south of France

By [email protected] (Jon North)



Not everyone knows exactlyu where we live in France, so here is a recap.  Next year we'll have been in Lunel for 20 years.  We have few regrets other than distance from family.  We are midway between 2 historic cities, Montpellier and Nîmes, on a rail link which can tansfer us rapidly onto the TGV line to Paris, and with 2 local airports less than 30 minutes away though we rarely fly now.  We are close to the A9 autoroute (the busiest motorway in France apparently) which takes you quickly t o Spain, Toulouse and Bordeaux as well as to the A7 north-south route up the Rhône valley.  Lunel is less than 10 km from the Med,, and not much further from those hills to the north, the inland Cevennes; but we often escape the heavier rain inland - the risk here is often too little rain rather than too much.


Another crop of lemons on the way

I started this post at the end of April in bright sunshine after a quick overnight shower - nevertheless I was able to mow the lawn first thing in the morning, and  (starting early) I have also been for my annual round of blood tests.  Like a lot of French healthcare these are precautionary - an underactive thyroid is the only known concern, but there are 15 tests on the prescription.  We find the blood testing service very efficient, and for those like me who wake early the lab opens at 6.30!  And by the end of the afternoon the results were with me by email - all well except the marginally high uric acid which I know is the result of liking alcoholic drinks, and causes twinges of gout.  The price of being a wine enthusiast!



tortoises sunning themselves this spring

Some lovely white flowers from the garden this Mayday, and of course the white flower sold everywhere in France today is the lily of the valley.  It has been a flower symbolising good luck in France since Charles IX in the 16th century, and has been officially recognised for the Fête du Travail since 1936.  It is pretty but deadly poisonous, and we have none in our garden.  The production of the flowers is a multi-million euro market apparently centrered around Bordeaux.



The yellow iris is called baroque prelude, one of Mary's favourites

mcmodernslopcore

Howdy, howdy, folks.

For many years (ten now, about which, more soon) McMansion Hell has featured many prominent and diverse atrocities from all over these great United States and sometimes beyond them. However, most of these posts have consisted of houses built during the McMansion Era proper – from the 80s up through around the early 2010s.

This is for a number of reasons. First of all: I like these houses because they are insane. Second of all, they are indeed quite different from one another – they represent the owner’s idiosyncratic if poorly rendered desires and fantasies. They are heavily psychologically loaded buildings. One family dreams endlessly of Tuscany, another wants to recreate the mall. All interiorize previously exterior forms of consumption.

These houses were also very expensive to build compared to their contemporary iterations: all real, solid wood cabinetry and trim, wrought iron railings, marble floors, elaborate murals - none of this is cheap. This is not to say that I’m nostalgic for the classical McMansion (though many are) only that it, like, most other facets of architectural and everyday life, have become progressively cheaper and more bland.

The McMansion never truly goes away. It merely changes shape over time. One of the shapes it currently takes is a particularly loathsome imitation of contemporary high architecture (specifically the kind of houses architects love to build for celebrities in California) executed in the most wretchedly parsimonious manner possible. It feels cheap to use the word ‘slop’ but their indiscriminate nature - the way they have no regard for why or how the things they imitate even work - allows it. Of all the building forms that could be generated with AI, this is the most likely. At any rate, behold:

Yes this is a real house. Yes you can buy it for $6 million in, yet again, Barrington, IL. It has 5 bedrooms and 5.5 bathrooms totaling 11,600 square feet. But most importantly, it looks like dogshit, and that’s with ten layers of Photoshop have been used to gussy it up which, by the way, also makes it appear entirely not of this world. Were it not for the photos of the empty interiors, I myself would have trouble trusting my own eyes. Part of the reason it looks so unreal is because the design itself is absurd, as though someone created four equally ugly vessels and threw them up one by one.

In 2017, in a now-deleted essay for Curbed (RIP - they destroyed the archive) I called these types of houses McModerns, simply because they were McMansions dressed up in modernist garb, which they wore no differently than they would Neo-Tudor or Mediterranean (broadly construed.) These houses don’t warrant a new neologism, but they do feel like a degraded or perhaps even gonzo version of even that old concept. Slop works fine too, especially because half of what’s in these images isn’t real.

Much fascinates me about these houses, however one of the most unique elements vis a vis the last 30 years of building is how overtly and almost hostilely masculine they are. Anything that can be construed as feminized - color, softness, ornament - has been ruthlessly purged. They also rip off tech industry minimalism which only ads to their bro-ey nature. While previous iterations of McModernism (think new builds in Colorado with fake wood exteriors) scream dads with IPAs, these houses scream Reddit to me. They are Elon Musk-adjacent in sentiment.

By the way, this is what that room looks like without the fake furniture. It’s basically a sunroom.

Whole Foods would like to call in a robbery.

Because these houses are designed by men, for men, no one involved has learned how a kitchen works. Many are calling this setup the “grindset tiktok video kitchen.” This is the kitchen you see in those day in the life of an AI startup founder videos your algorithm forces you to watch against your will.

Virtual staging is actual literal slop. In fact, one can say that it was an early harbinger of the ontological crisis we now face, one of the first instances where one is forced against one’s will to question reality, what one sees with one’s own eyes. Beyond that, I think virtual staging is literally a form of lying. You can use it to make a space look bigger or smaller than it is. In this – lying to impress – it also has a lot in common with AI. This dining room has nothing to do with the world I’m living in. These chairs are not my problem.

It’s actually AMAZING how much of what’s in this house, beyond the furniture, is fake. Every single material is fake. The stone is aluminum paneling. The plants are plastic. The concrete is printed on some kind of surface (as evidenced through its repetitive pattern), though it’s hard to say from just pictures. I don’t even trust the floors!!

Ok if you haven’t read Kelly Pendergrast’s amazing essay “Merchandizing the Void” about how houses are all like stores now, HERE IS THE LINK. Some ideas never die, they just evolve, king. Like you.

Please, I’m very cold.

Unfortunately there are no pictures of the rear exterior of this house, so this is where we will have to conclude for today. That being said, these houses and their antecedents are developing a design language all their own that will, in time, be as culturally rich to us as the houses of yore. The problem is they are less visually interesting. They are houses made to scroll in and scroll right by. Expect to see more of them here, but only if they have something, anything to say.

If you like this post and want more like it, support McMansion Hell on Patreon for as little as $1/month for access to great bonus content including a discord server, extra posts, and livestreams. (Don’t worry! This doesn’t adjust for inflation! Now’s the perfect time to join!) By the way: new subscribers can buy a year of McMansion Hell for just $12!

Not into recurring payments? Try the tip jar! (I would seriously appreciate any and all tips because I am in the process of moving house!)

mctuscan heaven

Howdy folks,

I have some good news, which is that, after seven months, I’ve finally recovered from Long Covid. This is not something I particularly want to talk about in depth but it was the worst thing that ever happened to me! Anyway, sorry for the long period without posting that much, but I hope this amazing house (both laudatory/derogatory, that’s dialectics, baby) will make up for the three months I went AWOL.

BEHOLD:

Not to be over-exuberant, but I genuinely think this is the best McMansion exterior of all time. That includes all the messed up castles, the Mediterranean-style cult complexes, the Staten Island weirdness. Nothing, to me, epitomizes just how uniquely wacky these houses can be. The oversized broken pediment with the fat fake corinthian columns, the lawyer foyer transom window, the ultra-nub, the 45-degree angle, it is all there and it is all hellish, and none of it will ever happen ever again. Anyway this house is $2.5 million dollars and 10,000 square feet. Someone should buy it and give house tours to young people for whom this way of live will soon be unimaginable.

There is nothing so bold to me as the idea of a canted lawyer foyer flanked by two equally huge windows. The fact that the house is more populated by vases than people…something something a vessel for wealth, ah!

Someone on TikTok is going to find this house and set all the pictures to that terrible vaporwave nostalgia song. “tuscan kitchen [black heart emoji]” (as is their right, just like blogging is my right)

If you were a rich person muralist, please get in touch with me ([email protected]) I want to hear YOUR stories!!!!

I mean, if I had a giant mysterious wardrobe I, too, would be fernmaxxing (I am 32 years old and will not be talking like this. I am getting generationmogged and have to draw the line somewhere.)

If someone says to you “we should go to Venice in May” ABORT ABORT ABORT. you WILL pay 15 euros for gin and tonic. you WILL get pickpocketed or puked on by British people. you WILL be eaten by mosquitoes. Go in November when no one’s around and you can have a good cry about how everything dies, sinks into the ocean, one might say, and how futile it is to try keeping it alive on horrible wooden stilts. The gondolier will tell you wistfully about how the dolphins returned to the lagoons during the pandemic lockdown. Then he will look at you because their leaving again is your fault.

I hate putting the word “cuck” in this blog. Ten years ago, that would warrant an angry parent email. Now children say cuck to each other in elementary school because they learned it from a Charlie Kirk assassination fancam.

This is kind of like one of those 19th century galleries but for 400,000aires who mostly think of art as a piece of furniture.

I used to not believe in the mobbed up pizza place (no one likes an ethnic stereotype) but there was one I went to in Coastal New Jersey that was unmistakably mobbed up. Guys coming in and out of the back in suits, cash only, no GrubHub, no delivery. It wasn’t called Vito’s though. That would be stupid of me to disclose.

It’s so funny that for a month we collectively pretended that every man alive cared about the roman empire. Just the kind of cute thing we used to do online before cultural microphenomena became primarily driven by incel forums.

That’s right, folks, McMansion Hell is TEN YEARS OLD this year, and there WILL be a party in Chicago in July. (More details later.) Anyway, heinous back facade. What were they thinking.

If you like this post and want more like it, support McMansion Hell on Patreon for as little as $1/month for access to great bonus content including a discord server, extra posts, and livestreams. (Don’t worry! This doesn’t adjust for inflation! Now’s the perfect time to join!) By the way: new subscribers can buy a year of McMansion Hell for just $12!

Not into recurring payments? Try the tip jar! (I would seriously appreciate any and all tips because I am now, like, $3000 in medical debt from having Long Covid, a disease doctors and insurance companies famously believe in and cover. If you are the woman who hacked up a lung next to me on my flight to New Mexico, not even an N95 could beat your germs and I feel entitled to financial compensation.)

Anyway! See you next month!

for patreon i wrote about getting stranded in tomorrowland as an 8th grader, michael sorkin’s…

for patreon i wrote about getting stranded in tomorrowland as an 8th grader, michael sorkin’s classic essay “see you in disneyland” and the legacy of 1990s disneyfied architecture and urbanism today

chud atlantis

Hello everyone, sorry to go so long without posting something. I caught covid in August and it’s taken me months to start feeling relatively back to normal. I am still struggling with fatigue and some neurological problems, so thank you for your patience!

It is rare that the McMansion ever approaches the mythical, though it is, of coursed, steeped in its own mythology – of bootstrapism, castle doctrine and, importantly, a total commitment to individualism. No one bereft of a sense of personal mythos would build some of the houses I’ve posted about on this site throughout the years.

However, rarely do those houses sincerely believe their own myths, express them so utterly. Often, there’s a bit of cheek involved in all those Corinthian columns, even among the knockoff Rolex set. Whenever one does swallow the (blue) kool aid, well, it’s very important to me. And so, from the forgotten underwater past of the greater Houston suburbs, I bring you: Chud Atlantis

(it is always more fun to quote the front bit of that Shelley poem, because the second bit has been misappropriated by Reddit.)

Atlantic in size (8 bedrooms, 9 baths, 10,000+ square feet), and in price ($2.8 million), Chud Atlantis is proof that, for better or for worse, we used to build things in this country. (Just kidding, this house was built, astonishingly enough, in 2023.) Its existence is baffling to me not only because it is anachronistic (it belongs in the Bad 70s) but because it is Texan. This house is, in the fullest sense of the word, a transplant. Orlando is that way.

(Shall we enter, then, the eye-watery depths?)

It’s important that you understand that the most significant thing about this house is that it is blue. In an age of gray supremacy, it is nice to know that tacky can still come in more unconventional shades. No one prior to this has ever looked at a piece of dyed marble and thought: I need to make this my entire personality. Not even in the 80s!

Like many McMansion owners, these do not know how to decorate. One can only presume that the furniture involved is so heavy that staging also wasn’t an option. This makes the house a historical document because from this point onward such rooms will henceforth be yassified with AI.

this kitchen begs for a concept food. it begs for ‘gold leaf hamburger.’

I’m not entirely convinced that the Rococo period was ugly, but its imitators commit crimes unerringly and without fail. Furniture like this sits in a room like a big glob of meat. Instead of saying 'i’m rich’ what it actually communicates is: 'i’m heavy.’

I don’t know how you can make so much money and yet have everything you do look like the bootleg Chanel rugs they sell outside of the subway. Like, can’t you buy the real thing, dawg?

This may also be the first house whose broad aesthetic is executed by way of direct to consumer printing. The FedExification of art. Or something like that. After all, the internet loves a neologism more than it loves its elaboration.

“What should we put here to fill out this room” all-time bad answer.

Anyway, without further ado, the back:

The suburban mind yearns for the miniature golf course. The suburban mind yearns for water while it all dries up.

If you like this post and want more like it, support McMansion Hell on Patreon for as little as $1/month for access to great bonus content including a discord server, extra posts, and livestreams. (Don’t worry! This doesn’t adjust for inflation! Now’s the perfect time to join!) By the way: new subscribers can buy a year of McMansion Hell for just $12!

Not into recurring payments? Try the tip jar! McMansion Hell stocks, much like mortgage-backed securities only ever go up! For non-architecture stuff I also have a substack where I write about things like the ring cycle and going to the eye doctor.

For Patreon, I wrote about developer slop flooring, the history of walking on plastic, and what fake…

For Patreon, I wrote about developer slop flooring, the history of walking on plastic, and what fake floors say about the world we live and build in.

glam metal modern but also your contractor is going to jail dawg

Sometimes a house is so ugly, disgust boomerangs back into a form of respect.

This is a rare phenomenon, one which should be treated seriously. I’ve been looking at ugly houses professionally for almost a decade now and I can say with confidence that there are only a handful of true goose eggs that meet the mark. This house – this remarkable, revolting house – located, of all places, in Randolph County, North Carolina, is perhaps the finest goose egg a rogue and most certainly confused contractor could possibly lay.

Yeehaw, man. For the curious, the house is on the market for over 500 grand despite being badly sited and measly 2600 square feet. Most of that is devoted to the lawyer foyer which is not the choice I would personally make, but hey, to each their own.

Most of the houses on McMansion Hell these days are submissions from members of the McMansion Hell Patreon, either in our discord server or on our livestreams. This one, however was a total fluke. I came across it by accident because my brother is looking to move to the area in order to be closer to my folks. (I doubt he’d be interested in something this, uh, unique.)

Now, in all these years, I’ve never devoted an entire post to the exterior of a house. As they say, there’s a first time for everything. There is so much going on with this house, all of it in direct opposition to the concept of taste, it requires a deeper investigation than the initial exterior image usually allows. (Also the entire interior is, as one might expect, entirely dark gray, complete with that awful washed out laminate flooring.)

(here is a sneak peek inside. the rest is not really important nor interesting.)

Anyway, without further ado, let’s hit it from the top.

First off, no, I don’t know what is inside this house’s giant, hammerhead-esque forehead. It’s not supported by anything so my assumption is, well, nothing. They put this in there for the sheer aesthetic love of the game.

Second, we have to talk about the siding. It’s vinyl, and $500 grand is firmly in Hardie®™© Board territory. You can already start to see it ripple against the cornice, which is probably fine. The cornices are painted black in a cartoony, Roy Lichtenstein fashion, that is, if Roy Lichtenstein was drunk. The can lights are a nice touch. They help highlight important parts of the facade, such as:

The vinyl siding and black trim will continue until morale improves. Also, I zoomed out here to include the forehead (fivehead?) just because the scale is INSANE – that’s like a 50-50 wall-to-fivehead ratio. Honestly, even though things in the world are pretty dire, I wouldn’t trust that cantilever with my life.

The window layout on this thing makes me wonder if the people who put it together have eyes that can see and a brain that connects to them. Now, I’m not going to invoke the Greek orders or anything, but I am going to say that every single architectural rule is being brazenly broken here. Total impunity. The window and door don’t line up at the top, which is the bare minimum of common decency. Then there’s that little guy pulling a Leeroy Jenkins up in the corner. You go dude.

The trim on these masses is starting to look AI generated but it’s probably just the HDR every realtor uses. The FaceTune of the field. Anyway, I think it’s a bad idea to put what looks like builder grade wood flooring on the outside of a house. It’s giving mold. It’s giving sunbleaching. It’s giving Etsy.

As we can see, another familiar McMansion Hell enemy has also made an appearance: the prairie mullion window. There is no reason to use this window unless it involves building a fake bungalow, but the worst possible place to use it is in this particular situation. It’s the only window with white mullions, it looks weird with the siding, and it’s not exactly “”“modern”“” or whatever this house is supposed to be.

(Often I wonder if some people believe that modernism is just “doing some stuff with squares” and the more squares there are the more modernist it is. Probably not true, but then again, I’m not the one pulling massive profit on houses that look like doo doo so jokes on me.)

Zooming out again because context still matters even in the most nonsensical situations. The funny thing about this house is that the only normal part of it is the front door and even then… what?? Also, look at that siding-less patch of brick on the right. As though to say: haha! Finally, I love how the stairs lead down into a bunch of rocks. Serves you right!

Thanks to advanced screenshotting technology, we can see that there are also prairie mullions on these other windows, it’s just that they’re a more reasonable black. Don’t worry though, the windows are still offensive. They’re two windows stuck together in order to give the impression of a single continuous one. (Remember the inside shot?) Nice try, bucko. Second, why don’t the two windows meet where that little band of siding is? Well, we all know the answer to this question. (We don’t, in fact, know the answer to this question.)

This is my favorite part of the house. It’s almost good, to me, which is why I saved it for last. I have no idea what the hell that glossy composition book siding is but I love it. I’ve never seen it before. I also like how they’re doing a weird entablature-quoin combo thing with it, but only on the right side of the house. There’s some great five-cornice action going on but, thanks to the precedents set by truly mid postmodernism, it works.

Unfortunately there are some downsides here. What’s the deal with that tiny, skinny stone? brick? veneer? Second, why is the siding just hanging off the edge like that? That whole little section where the three (four?) cladding meet is precipitous. The cheapo off-white developer special garage door with the little trad elements is a nice gesture, one that tells you life has no meaning. Why bother?

Anyway, after all that, if we put it all together again, we get this:

If you like this (unusual) post and want more like it, support McMansion Hell on Patreon for as little as $1/month for access to great bonus content including a discord server, extra posts, and livestreams. (Don’t worry! This doesn’t adjust for inflation! Now’s the perfect time to join!) By the way: new subscribers can buy a year of McMansion Hell for just $12!

Not into recurring payments? Try the tip jar! McMansion Hell stocks, much like mortgage-backed securities only ever go up!

FYI, this post is now available for all to read!

mcmansionhell:

Bonus Post: The McMansionization of the White House, or: Regional Car Dealership Rococo, a treatise

FYI, this post is now available for all to read!

McMansion Hell urges all New Yorkers to Rank Zohran Mamdani #1 for Mayor of NYC

I know I am just a blog about ugly houses but I want to say something important here: the ruling class in this country does not want you to have affordable housing. They don’t want you to have clean, reliable public transportation. They don’t want you to have access to groceries you can afford. If something bad happens to you, they don’t care if you live or die. If you lose your home, they will hole up in their penthouses, McMansions, and mommy-bought apartments and tell you it’s your fault – but it’s not. It is theirs. Everything from budget cuts to rent hikes, is their fault, their way of ensuring that the city becomes a place made up solely of people like themselves.

Zohran Mamdani is the only high profile candidate I’ve seen in my narrow, millennial lifetime running for any position – least of all the mayor of the biggest city in the country – on a platform of decommodification in terms of access to food, housing and transportation. City-run grocery stores would ensure that food stays affordable because there is no profit motive. While some are critical of his policy of fare-free transportation (as opposed to spending the same amount of money improving services), given the amount of policing involved in watching the fareboxes, it’s something I’m coming more and more around to.

In demanding a rent freeze, Zohran is one of the only politicians able to articulate a direct plan for keeping people in their homes at a time when rent is skyrocketing with no end in sight. Zohran is one of a limited few in this miserable, cowardly country who are willing to speak out for the rights of Palestinians being murdered en masse by Israel. A vote for Zohran is a vote for the idea that better things are possible and, if you ask me, I think we live in such dire times that we’ve begun to forget this fundamental truth: things do not have to be like this. We do not have to live under the jackboot of privatization and exploitation forever. That choice, however, is up to us.

I am forever skeptical of the power of the ballot box to enact lasting change, especially in recent years. In fact, I am the most skeptical of electoralism I have ever been. However, why is it that the right can use what little sovereignty and enfranchisement is available to us to enact sweeping, if devastating changes, and yet, when the opportunity presents itself to the left, all we hear is that such things are no better than pissing in the wind? The answer to this question, of course, is that the ruling class is perfectly content with a party that hinders rather than ushers in change. Zohran may be using the sclerotic party system we’ve been doomed to inhabit, but despite these limitations his candidacy has surged immensely in the last few months, and the momentum of the people is on his side. This may be one of the last chances wherein one can attempt a truly progressive campaign like this.

Now that things are heating up, the ruling class, the backers of Andrew Cuomo, an abuser of women and a man responsible for the untold deaths of the elderly because he valued profits over their lives so early on in the pandemic, will stop at nothing to make sure that Zohran Mamdani does not win, that things stay the same. That the rent goes up, that the grocery prices continue to explode, that New York City becomes the playground of the rich and famous at the expense of everyone else. The party will try to intervene in undemocratic ways just like they did with Bernie Sanders in the 2020 primary. There will be untold lies and accusations, the press will abandon what few journalistic obligations they still abide by, and it will get ugly. There are even rumors that Cuomo will run as an independent even if he loses the primary, which, to be honest, isn’t a bad tactic – he’s just the worst guy to be using it.

I realize this post may be annoying to some (hell, I myself live in Chicago), and I’m sure there’s some rightful criticism for my not having used my blog like this before. (However, for those of you who don’t know, I usually write about all manner of politics in my column at The Nation!) That being said, if you follow me and you live in New York City, rank Zohran #1 and Brad Lander #2. DO NOT RANK SUBURBANITE BIKE LANE-PARKER ANDREW CUOMO.

Anyway, that’s all. I’ll be back with a new McMansion Hell this Friday, so stay tuned.

Bonus Post: The McMansionization of the White House, or: Regional Car Dealership Rococo, a treatise

simulacra for bootlickers

FYI, this post is a little more NSFW than usual with the language.

Usually I think McMansions are kind of funny. Sometimes, I even like them. If I didn’t like them at least a little bit, I don’t think I’d be running this blog for a solid eight years and counting. Some McMansions are so strange and so fascinating in their architectural languages (it’s never just one language) that they test the boundaries of what residential architecture can do on an individual and often ad hoc level. Others so cogently and often whimsically express various cultural fascinations and deeply entrenched American ideas of what prosperity looks like (read: neuroticisms), that, as a sociological text they remain unrivaled.

But some (many!) McMansions are, to put it bluntly, evil. And it is these McMansions that reveal the ugly truth beneath the ugly architecture: that the McMansion is a manifestation of power and wealth meant to communicate that power and wealth to others as explicitly as possible, and that it does so in a country besieged by brutal and inescapable income inequality. In our present political moment characterized by extreme and deliberate cruelty, fear, and baleful destruction of all that is pro-social in nature (and nature itself), I figured it was my duty to show my readers a house that embodies these sentiments, one we can all use to assuage some of our perceived powerlessness by way of mocking the shit out of it.

There are a lot of fake White Houses in the US. Most of them can be found in or around the area of McLean, Virginia, the ground zero of DC blob sickos whose job it is to mete out the ratio of lethality and economy for weapons manufacturers. This one, however, is in Indiana, outside of Evansville. It was built at the apex of theme park mindset in architecture (1997) and is on the market for $4.9 million dollars. However, don’t be fooled by this opening exterior shot. It takes literal drone footage to show how unhinged this house actually is. In reality, the White House facade is akin to the light dangling from an anglerfish, luring the unsuspecting victim in…

Completely NORMAL amount of money at play here!

There are some images historians (if there are any left) will look back upon and say, such a phenomenon truly would not be possible without an abundance of cheap oil and derivative products. Fortunately, in the immanent post-neoliberal chobani yogurt solarpunk utopia, this house will be converted into a half ruin garden (though this will take some time with all the plastic) half public spa complex. A better world is possible, but only if we imagine it.

Pro tip: there’s a way of saying “wow it’s so big” that can land as the most devastating insult in the rhetorical lexicon.

I’ll be real, the armchair thing is a new one for me, too.

(Rise and grindset voice): Inside you are two lions. Both of them are hungry for prosperity and success. Let’s get this bread, king.

Not to do gender here, but compared to the rest of the house, this is a “my wife got her way” room if there ever was one.

Fixer Upper was basically 9/11 for “architectural foam trappings” and “color.” Look what they took from you…

Honestly, what a great juxtaposition. This is what that book The Machine in the Garden was all about. (No it’s not.)

Half of this post tbh:

Well, that’s it for this extremely upbeat and positive McMansion Hell post in this extremely positive and upbeat time we are living in. Join us soon for the concluding part 2 of the Neuschwanstein Castle series, especially if you like beautiful, psychosexually crippled swan boys (real and fictional) and kitsch theory.

If you like this post and want more like it, support McMansion Hell on Patreon for as little as $1/month for access to great bonus content including a discord server, extra posts, and livestreams. (Don’t worry! This doesn’t adjust for inflation! Now’s the perfect time to join!)

Not into recurring payments? Try the tip jar! McMansion Hell stocks, much like mortgage-backed securities only ever go up!!

About my last few months.

About my last few months.

on neuschwanstein castle (part 1)

This is an essay in two parts.

Neuschwanstein Concept Drawing by the stage designer (!!) Christian Jank (1869).

There exist in architecture clear precedents to the McMansion that have nothing to do with suburban real estate. This is because “McMansionry” (let’s say) has many transferable properties. Among them can be included: 1) a diabolical amount of wealth that must be communicated architecturally in the most frivolous way possible, 2) a penchant for historical LARPing primarily informed by media (e.g. the American “Tuscan kitchen”) and 3) the execution of historical styles using contemporary building materials resulting in an aesthetic affect that can be described as uncanny or cheap-looking. By these metrics, we can absolutely call Neuschwanstein Castle, built by the architect Eduard Riedel for King Ludwig II of Bavaria, a McMansion.

Constructed from 1869 through 1886 – the year of Ludwig’s alleged suicide after having been ousted and declared insane – the castle cost the coffers of the Bavarian state and Ludwig himself no fewer than 6.2 million German gold marks. (That’s an estimated 47 million euros today.) The castle’s story is rife with well-known scandal. I’m sure any passing Swan Enthusiast is already familiar with Ludwig’s financial capriciousness, his called-off marriage and repressed homosexuality, his parasocial obsession with Richard Wagner, his complete and total inability to run his country, and his alleged “madness,” as they used to call it. All of these combine to make Neuschwanstein inescapable from the man who commissioned it – and the artist who inspired it. Say what you like about Ludwig and his building projects, but he is definitely remembered because of them, which is what most monarchs want. Be careful what you wish for.

Neuschwanstein gatehouse.

How should one describe Neuschwanstein architecturally? You’d need an additional blog. Its interiors alone (the subject of the next essay) range from Neo-Baroque to Neo-Byzantine to Neo-Gothic. There are many terms that can loosely define the palace’s overall style: eclecticism, medieval revivalism, historicism, chateauesque, sclerotic monarchycore, etc. However, the the most specific would be what was called “castle Romanticism” (Burgenromantik). The Germans are nothing if not literal. Whatever word you want to use, Neuschwanstein is such a Sistine Chapel of pure sentimentality and sugary kitsch that theme park architecture – most famously, Disney’s Cinderella’s castle itself – owes many of its medieval iterations to the palace’s towering silhouette.

There is some truth to the term Burgenromantik. Neuschwanstein’s exterior is a completely fabricated 19th century storybook fantasy of the Middle Ages whose precedents lie more truthfully in art for the stage. As a castle without fortification and a palace with no space for governance, Neuschwanstein’s own program is indecisive about what it should be, which makes it a pretty good reflection of Ludwig II himself. To me, however, it is the last gasp of a monarchy whose power will be totally extinguished by that same industrial modernity responsible for the materials and techniques of Neuschwanstein’s own, ironic construction.

In order to understand Neuschwanstein, however, we must go into two subjects that are equally a great time for me: 19th century medievalism - the subject of this essay - and the opera Lohengrin by Richard Wagner, the subject of the next. (1)

Part I: Medievalisms Progressive and Reactionary

The Middle Ages were inescapable in 19th century Europe. Design, music, visual art, theater, literature, and yes, architecture were all besotted with the stuff of knights and castles, old sagas, and courtly literature. From arch-conservative nationalism to pro-labor socialism, medievalism’s popularity spanned the entire political spectrum. This is because it owes its existence to a number of developments that affected the whole of society.

In Ludwig’s time, the world was changing in profound, almost inconceivable ways. The first and second industrial revolutions with their socioeconomic upheavals and new technologies of transport, manufacturing, and mass communication, all completely unmade and remade how people lived and worked. This was as true of the average person as it was of the princes and nobles who were beginning to be undermined by something called “the petit bourgeoisie.”

Sustenance farming dwindled and wage labor eclipsed all other forms of working. Millions of people no longer able to make a living on piecemeal and agricultural work flocked to the cities and into the great Molochs of factories, mills, stockyards, and mines. Families and other kinship bonds were eroded or severed by the acceleration of capitalist production, large wars, and new means of transportation, especially the railroad. People became not only alienated from each other and from their labor in the classical Marxist sense but also from the results of that labor, too. No longer were chairs made by craftsmen or clothes by the single tailor – unless you could afford the bespoke. Everything from shirtwaists to wrought iron lamps was increasingly mass produced - under wretched conditions, too. Things – including buildings – that were once built to last a lifetime became cheap, disposable, and subject to the whimsy of fashion, sold via this new thing called “the catalog.”

William Morris’ painting Le Belle Iseult (1868).

Unsurprisingly, this new way of living and working caused not a little discontent. This was the climate in which Karl Marx wrote Capital and Charles Dickens wrote A Christmas Carol. More specific to our interests, however, is a different dissenter and one of the most interesting practitioners of medievalism, the English polymath William Morris.

A lover of Arthurian legend and an admirer of the architect and design reformer John Ruskin, Morris was first trained in the office of architect G. E. Street, himself a die-hard Gothic Revivalist. From the very beginning, the Middle Ages can be found everywhere in Morris’ work, from the rough-hewn qualities of the furniture he helped design to the floral elements and compositions of the art nouveau textiles and graphics he’s most famous for – which, it should be said, are reminiscent of 15th century English tapestries. In addition to his design endeavors, Morris was also a gifted writer and poet. His was a profound love for medieval literature, especially Norse sagas from Iceland. Some of these he even translated including the Volsunga Saga – also a preoccupation of Wagner’s. Few among us earn the title of polymath, but Morris’ claim to it is undeniable. Aside from music, there really wasn’t any area of creative life he didn’t touch.

However, Morris’ predilection for the medieval was not just a personal and aesthetic fascination. It was also an expression of his political rejection of the capitalist mode of production. As one of the founders of the English Arts & Crafts Movement, Morris called for a rejection of piecemeal machine labor, a return to handicraft, and overall to things made well and made with dignity. While this was and remains a largely middle class argument, one that usually leads down the road of ethical consumption, Morris was right that capitalism’s failing of design and architecture did not just lie with the depreciated quality of goods, but the depreciated quality of life. His was the utopian call to respect both the object and the laborer who produced it. To quote from his 1888 essay called “The Revival of Architecture,” Morris dreamed of a society that “will produce to live and not live to produce, as we do.” Indeed, in our current era of AI Slop, there remains much to like about the Factory Slop-era call to take back time from the foreman’s clock and once more make labor an act of enjoyable and unalienated creativity. Only now it’s about things like writing an essay.

I bother to describe Morris at length here for a number of reasons. The first is to reiterate that medievalism’s popularity was largely a response to socioeconomic changes. Additionally, since traditionalism - in Ludwig’s time and in ours - still gets weaponized by right-wing losers, it’s worth pointing out that not all practitioners of medievalism were politically reactionary in nature. However – and I will return to this later – medievalism, reactionary or not, remains inescapably nostalgic. Morris is no exception. While a total rejection of mass produced goods may seem quixotic to us now, when Morris was working, the era before mass industrialization remained at the fringes of living memory. Hence the nostalgia is perhaps to be expected. Unfortunately for him and for us, the only way out of capitalism is through it.

To return again to the big picture: whether one liked it or not, the old feudal world was done. Only its necrotic leftovers, namely a hereditary nobility whose power would run out of road in WWI, remained. For Ludwig purposes, it was a fraught political time in Bavaria as well. Bavaria, weird duck that it was, remained relatively autonomous within the new German Reich. Despite the title of king, Ludwig, much to his chagrin - hence the pathetic Middle Ages fantasizing - did not rule absolutely. His was a constitutional monarchy, and an embattled one at that. During the building of Neuschwanstein, the king found himself wedged between the Franco-Prussian War and the political coup masterminded by Otto von Bismarck that would put Europe on the fast track to a global conflict many saw as the atavistic culmination of all that already violent modernity. No wonder he wanted to hide with his Schwans up in the hills of Schwangau.

The very notion of a unified German Reich (or an independent Kingdom of Bavaria) was itself indicative of another development. Regardless if one was liberal or conservative, a king, an artist or a shoe peddler, the 19th century was plagued by the rise of modern nationalism. Bolstered by new ideas in “medical” “science,” this was also a racialized nationalism. A lot of emotional, political, and artistic investment was put into the idea that there existed a fundamentally German volk, a German soil, a German soul. This, however, was a universalizing statement in need of a citation, with lots of political power on the line. Hence, in order to add historical credence to these new conceptions of one’s heritage, people turned to the old sources.

Within the hallowed halls of Europe’s universities, newly minted historians and philologists scoured medieval texts for traces of a people united by a common geography and ethnicity as well as the foundations for a historically continuous state. We now know that this is a problematic and incorrect way of looking at the medieval world, a world that was so very different from our own. A great deal of subsequent medieval scholarship still devotes itself to correcting for these errors. But back then, such scholarly ethics were not to be found and people did what they liked with the sources. A lot of assumptions were made in order to make whatever point one wanted, often about one’s superiority over another. Hell, anyone who’s been on Trad Guy Deus Vult Twitter knows that a lot of assumptions are still made, and for the same purposes.(2)

Meanwhile, outside of the academy, mass print media meant more people were exposed to medieval content than ever before. Translations of chivalric romances such as Wolfgang von Eschenbach’s Parzival and sagas like the Poetic Edda inspired a century’s worth of artists to incorporate these characters and themes into their work. This work was often but of course not always nationalistic in character. Such adaptations for political purposes could get very granular in nature. We all like to point to the greats like William Morris or Richard Wagner (who was really a master of a larger syncretism.) But there were many lesser attempts made by weaker artists that today have an unfortunate bootlicking je nais se quoi to them.

I love a minor tangent related to my interests, so here’s one: a good example of this nationalist granularity comes from Franz Grillparzer’s 1823 pro-Hapsburg play König Ottokars Glück und Ende, which took for its source a deep cut 14th century manuscript called the Styrian Rhyming Chronicle, written by Ottokar Aus Der Gaul. The play concerns the political intrigue around King Ottokar II of Bohemia and his subsequent 1278 defeat at the hands of Grillparzer’s very swagged out Rudolf of Habsburg. Present are some truly fascinating but extremely obscure characters from 13th Holy Roman Empire lore including a long-time personal obsession of mine, the Styrian ministerial and three-time traitor of the Great Interregnum, Frederick V of Pettau. But I’m getting off-topic here. Let’s get back to the castle.

The Throne Room at Neuschwanstein

For architecture, perhaps the most important development in spreading medievalism was this new institution called the “big public museum.” Through a professionalizing field of archaeology and the sickness that was colonialist expansion, bits and bobs of buildings were stolen from places like North Africa, Egypt, the Middle East, and Byzantium, all of which had an enormous impact on latter 19th century architecture. (They were also picked up by early 20th century American architects from H. H. Richardson to Louis Sullivan.) These orientalized fragments were further disseminated through new books, monographs, and later photography.

Meanwhile, developments in fabrication (standardized building materials), construction (namely iron, then steel) and mass production sped things up and reduced costs considerably. Soon, castles and churches in the image of those that once took decades if not a century to build were erected on countless hillsides or in little town squares across the continent. These changes in the material production of architecture are key for understanding “why Neuschwanstein castle looks so weird.”


Part of what gives medieval architecture its character is the sheer embodiment of labor embedded in all those heavy stones, stones that were chiseled, hauled, and set by hand. The Gothic cathedral was a precarious endeavor whose appearance of lightness was not earned easily, which is why, when writing about their sublimity, Edmund Burke invoked not only the play of light and shadow, but the sheer slowness and human toil involved.

This is, of course, not true of our present estate. Neuschwanstein not only eschews the role of a castle as a “fortress to be used in war” (an inherently stereotomic program) but was erected using contemporary materials and techniques that are simply not imbued with the same age or gravitas. Built via a typical brick construction but clad in more impressive sandstone, it’s all far too clean. Neuschwanstein’s proportions seem not only chaotic - towers and windows are strewn about seemingly on a whim - they are also totally irreconcilable with the castle’s alleged typology, in part because we know what a genuine medieval castle looks like.

Ludwig’s palace was a technological marvel of the industrial revolution. Not only did Neuschwanstein have indoor plumbing and central heat, it also used the largest glass windows then in manufacture. It’s not even an Iron Age building. The throne room, seen earlier in this post, required the use of structural steel. None of this is to say that 19th century construction labor was easy. It wasn’t and many people still died, including 30 at Neuschwanstein. It was, however, simply different in character than medieval labor. For all the waxing poetic about handiwork, I’m sure medieval stonemasons would have loved the use of a steam crane.

It’s true that architectural eclecticism (the use of many styles at once) has a knack for undermining the presumed authenticity or fidelity of each style employed. But this somewhat misunderstands the crime. The thing about Neuschwanstein is that its goal was not to be historically authentic at all. Its target realm was that of fantasy. Not only that, a fantasy informed primarily by a contemporary media source. In this, it could be said to be more architecturally successful.

The fantasy of medievalism is very different than the truth of the Middle Ages. As I hinted at before, more than anything else, medievalism was an inherently nostalgic movement, and not only because it was a bedrock of so much children’s literature. People loved it because it promised a bygone past that never existed. The visual and written languages of feudalism, despite it being a terrible socioeconomic system, came into vogue in part because it wasn’t capitalism. We must remember that the 19th century saw industrial capitalism at its newest and rawest. Unregulated, it destroyed every natural resource in sight and subjected people, including children, to horrific labor conditions. It still does, and will probably get worse, but the difference is, we’re somewhat used to it by now. The shock’s worn off.

All that upheaval I talked about earlier made people long for a simplicity they felt was missing. This took many different forms. The rapid advances of secular society and the incursion of science into belief made many crave a greater religiosity. At a time when the effects of wage labor on the family had made womanhood a contested territory, many appeals were made to a divine and innocent feminine a la Lady Guinevere. Urbanization made many wish for a quieter world with less hustle and bustle and better air. These sentiments are not without their reasons. Technological and socioeconomic changes still make us feel alienated and destabilized, hence why there are so many medieval revivals even in our own time. (Chappell Roan of Arc anyone?) Hell, our own rich people aren’t so different from Ludwig either. Mark Zuckerburg owns a Hawaiian island and basically controls the fates of the people who live there lord-in-the-castle-style.

Given all this, it’s not surprising that of the products of the Middle Ages, perhaps chivalric romance was and remains the most popular. While never a real depiction of medieval life (no, all those knights were not dying on the behalf of pretty ladies), such stories of good men and women and their grand adventures still capture the imaginations of children and adults alike. (You will find no greater fan of Parzival than yours truly.) It’s also no wonder the nature of the romance, with its paternalistic patriarchy, its Christianity, its sentimentality around courtly love, and most of all its depiction of the ruling class as noble and benevolent – appealed to someone like Ludwig, both as a quirked-up individual and a member of his class.

It follows, then, that any artist capable of synthesizing all these elements, fears, and desires into an aesthetically transcendent package would’ve had a great effect on such a man. One did, of course. His name was Richard Wagner.

In our next essay, we will witness one of the most astonishing cases of kitsch imitating art. But before there could be Neuschwanstein Castle, there had to be this pretty little opera called Lohengrin.

(1) If you want to get a head start on the Wagner stuff, I’ve been writing about the Ring cycle lately on my Substack: https://www.late-review.com/p/essays-on-wagners-ring-part-1-believing

(2) My favorite insane nationalist claim comes from the 1960s, when the Slovene-American historian Joseph Felicijan claimed that the US’s democracy was based off the 13th century ritual of enthronement practiced by the Dukes of Carinthia because Thomas Jefferson owned a copy of Jean Bodin’s Les six livres de la Republique (1576) in which the rite was mentioned. For more information, see Peter Štih’s book The Middle Ages Between the Alps and the Northern Adriatic (p. 56 for the curious.)

If you like this post and want more like it, support McMansion Hell on Patreon for as little as $1/month for access to great bonus content including a discord server, extra posts, and livestreams.

Not into recurring payments? Try the tip jar! Student loans just started back up!

New on Patreon: New Jersey Bonus Post (5 additional, “wonderful” rooms!“

New on Patreon: New Jersey Bonus Post (5 additional, “wonderful” rooms!“

new jersey “19th century” “eclecticism”

It’s always funny to me when new wealth tries to imitate old wealth, but in a very specific way: by trying to reproduce old ways of building that are no longer viable via mass produced building materials and contractors who are better than average but still not quite in the legion of the bespoke. It’s rarely the case that houses are fully “custom” these days – the amalgamation of all the different parts in a new formation is the “customization” at work. As we can see in this example, this is a truth that is often covered up by excessive decorating.

This 5 bedroom, 6.5 bathroom house, built in 1997 (shocker) will run you an extremely reasonable $3.5 million big ones, but I say extremely reasonable because it wants to be a $10 million house but doesn’t quite get there - after all, it’s made with drywall. The architectural style is not really anything in particular – though the front entrance would like to recall the Tudors. Really it is trying to emulate an existing pastiche style, namely the eclecticism of the 19th century. It also doesn’t do this well.

No stately manor is complete without dueling staircases. Also, I don’t know how to explain it, but every room in this house longs to be a bathroom. Or a powder room. A really big one. It’s probably the floor, and the wallpaper. This is just the appetizer for the main attraction:

Jules Verne larping is so rare in McMansion Hell that you have to commend them for trying. I’m kind of obsessed.

This room is so important to me. It’s like if an Olin Mills (dating myself here) set was an entire room. A sense of watching someone in one’s own house, performing “dinner.” Also I would slay as the swan knight, I have to say, so I get it.

What happened to baskets hanging from the ceiling and powder blue walls and porcelain lined up on the picture rail?

I have seen columns terminating into soffits that would make Scamozzi cry.

In Big America bathing and lavishing is a spectator sport.

Ok, again, the palette of this house is basically The Polar Express mixed with a very bizarre hotel lobby.

The chimney hole is sending me because that does appear to be a working chimney. Like, can you see the smoke come out? Who knows!

Anyway, happy Thanksgiving to everyone, and I’m especially thankful to the folks who sponsor me on Patreon! If you want to see more scenes from this house, that’s the place to do it!

If you like this post and want more like it, support McMansion Hell on Patreon for as little as $1/month for access to great bonus content including a discord server, extra posts, and livestreams.

Not into recurring payments? Try the tip jar! Student loans just started back up!

2007-core nostalgia extravaganza

Quick PSA: someone on Facebook is apparently impersonating me using an account called “McMansion Hell 2.0” – If you see it, please report! Thanks!

Howdy folks! I hope if you were born between 1995 and 2001 you’re ready for some indelible pre-recession vibes because I think this entire house, including the photos have not been touched since that time.

This Wake County, NC house, built in 2007, currently boasts a price tag of 1.7 million smackaroos. Its buxom 4 bedrooms and 4.5 baths brings the total size to a completely reasonable and not at all housing-bubble-spurred 5,000 square feet.

I know everyone (at least on TikTok) thinks 2007 and goes immediately to the Tuscan theming trend that was super popular at the time (along with lots of other pseudo-euro looks, e.g. “french country” “tudor” etc). In reality, a lot of decor wasn’t particularly themed at all but more “transitional” which is to say, neither contemporary nor super traditional. This can be pulled off (in fact, it’s where the old-school Joanna Gaines excelled) but it’s usually, well, bland. Overwhelmingly neutral. Still, these interiors stir up fond memories of the last few months before mommy was on the phone with the bank crying.

I think I’ve seen these red/navy/beige rugs in literally every mid-2000s time capsule house. I want to know where they came from first and how they came to be everywhere. My mom got one from Kirkland’s Home back in the day. I guess the 2010s equivalent would be those fake distressed overdyed rugs.

I hate the kitchen bench trend. Literally the most uncomfortable seating imaginable for the house’s most sociable room. You are not at a 19th century soda fountain!!! You are a salesforce employee in Ohio!!!

You could take every window treatment in this house and create a sampler. A field guide to dust traps.

Before I demanded privacy, my parents had a completely beige spare bedroom. Truly random stuff on the walls. An oversized Monet poster they should have kept tbh. Also putting the rug on the beige carpet here is diabolical.

FYI the term “Global Village Coffeehouse” originates with the design historian Evan Collins whose work with the Consumer Aesthetics Research Institute!!!!

This photo smells like a Yankee Candle.

Ok, now onto the last usable photo in the set:

No but WHY is the house a different COLOR??????? WHAT?????

Alright, I hope you enjoyed this special trip down memory lane! Happy (American) Labor Day Weekend! (Don’t forget that labor is entitled to all it creates!)

If you like this post and want more like it, support McMansion Hell on Patreon for as little as $1/month for access to great bonus content including a discord server, extra posts, and livestreams.

Not into recurring payments? Try the tip jar! Student loans just started back up!