Journalist/developer. Storytelling developer @ USA Today Network. Builder of @HomicideWatch. Sinophile for fun. Past: @frontlinepbs @WBUR, @NPR, @NewsHour.
1953 stories

Finding Bathroom Faucets with Embeddings

1 Share

Using embeddings to navigate impenetrable domains

A confusing plumbing showroom

Embeddings Measure Contextual Similarity

A pretty good, pithy description of neural networks is that they are, “context probability machines.” Provide them with vast quantities of data and they’ll identify patterns, noting where certain data points coincide with others. Once trained, we can provide a neural network with a new bit of data and it will place it within the contextual map it assembled.

Placing a bit of datum into this contextual mapping is called embedding, and is expressed as a vector of numbers. Think of a vector like a latitude and longitude coordinate pair that places a point on a map. But instead of two numbers (lat, lon), a vector might have hundreds of values.

With embeddings we can measure how contextually similar things are to other things; be they words, phrases, blog posts, images, or songs. Embeddings allow us to build “similarity machines” that gauge contextual likeness. Once built, they’re efficient, quick, and extraordinarily powerful.

Which is precisely why I turned to them when shopping for bathroom faucets.

Our family recently started a major home renovation project, an ordeal seemingly designed to generate decision fatigue. There are countless paint swatches, light fixtures, tiles, countertops, and faucets. One plumbing supply website we’ve been browsing contains over 75,000 bathroom faucet options.

Thankfully, we can use the power of embeddings to cut through the noise and navigate this impenetrable domain!

Finding Faucets with Embeddings

What I wanted, which no store website seemed to offer, was a way to find faucets by navigating down a decision tree. Show me a range of faucets, let me select the one I like best, then show me a range of faucets that are similar to the one I selected. Repeat until I find my perfect faucet.

Armed with a collection of nearly 20,000 images of bathroom fixtures and their associated product data, I fired up one of my favorite tools for quickly dealing with embeddings, llm. Written by Simon Willison, llm is a command-line app and Python library for easily interacting with various large language models. It’s a great resource for quickly generating embeddings and comparing them.

Let’s install llm and the model we’ll need:

pip install llm
llm install llm-sentence-transformers
llm install llm-clip

That last line downloads and sets up OpenAI’s CLIP. CLIP is a great model for this use case because it can embed both text and images, and compare across the two.

Assuming you have a directory of images (named “images”), we can generate embeddings for them like so:

llm embed-multi faucets --files images/ '*.jpg' --binary -m clip

All generated embeddings, along with the associated filenames, will be stored in a SQLite database llm maintains. We specify the collection name (“faucets”), for future reference, point llm at a directory of images, specify we’re feeding in binary data (as opposed to text), then specify the model we want to use (CLIP).

Once llm is done generating embeddings, we can use it to compare images, like so:

llm similar faucets -i images/example.jpg --binary

This will embed the provided image (example.jpg) and compare the result to our collection of faucet embeddings. It will then return the top 10 most similar faucets, along with their filenames and similarity scores, as JSON output.

Here are the top 4 faucets recommended when the model is given the large faucet on the left as input:

Similar faucets

Pretty good! We’re well on our way to our decision tree tool. We just need to wrap this in a UI.

Building Faucet Finder

For our UI, we’re going to use another of Simon Willison’s tools, datasette. Datasette is a tool for building quick interfaces for SQLite databases (which is how llm stored our embeddings.)

To stand this up, we need to:

  1. Compile Our Database: We’ll extract our embeddings table from the llm database and load it into a new SQLite database. We then load this database with a separate table containing image and product URLs for each faucet.
  2. Install Some Plugins: Install the datasette plugins we’ll need: data-template-sql, datasette-faiss, datasette-publish-fly, and datasette-scale-to-zero.
  3. Design Our Templates: We want two pages for our app. The first serves up a random set of faucet images. Clicking one of these faucets sends you to our second page, which shows you faucets similar to the one you clicked. The first will be our home page, the second will be a “canned query” page that uses datasette-faiss to query our embeddings and accepts a faucet ID as an input parameter. We’ll build both pages using custom templates, overriding datasette’s default styles. For our home page, we’ll execute our query using data-template-sql.
  4. Deploy Our App: We’ll use, datasette-publish-fly and datasette-scale-to-zero.

And voila: Faucet Finder.

The Faucet Finder website

It’s surprisingly effective! Playing with this for 15 minutes or so yielded us several candidates we’re going to evaluate in person.

Bonus: Searching Images with Text

Early we noted that our embedding model, CLIP, can compare both images and text. This yielded a pleasant surprise: we can effectively search for faucets using words and phrases.

We just need to alter our llm command slightly:

llm similar faucets -c "Gawdy"

Which yields…

Faucets similar to "gawdy"

It’s functional and entertaining. Here are the results for “Bond Villain” and “Nintendo 64”:

Faucets similar to "Bond Villain" and "Nintendo 64"

Adding this feature to Faucet Finder would take a bit of work, as we’d have to compute the embedding for our text prompt rather than just compare already computed embeddings. If you want to take a crack at it, fork away.

What Could Be Better?

One of my pet peeves when it comes to blog posts and papers dealing with AI is their tendency to only share their best output examples. They don’t show where the model falls down. Attempting to replicate their output rarely yields similar quality results, at least at first.

Which is a shame! The models are usually impressive despite these quirks. There’s just so much noise in the AI space, authors rarely take a warts-and-all approach. You can hardly blame them.

So, in the spirit of transparency, here’s where Faucet Finder falls down:

  1. Many of the faucet images aren’t contextually consistent, which skews the results. Most are isolated on a white background, but a few pictures are of installed faucets. This can affect the results. If you ask for faucets similar to an image of a faucet on a white background you’ll get a lot of faucets on white backgrounds. If you search with text that describes a context a faucet might be installed in (say, a kitchen or bathroom), you’ll get installed faucets. For example, my search for “a luxury Manhattan apartment in the 1950s” yielded only faucets in situ. If we were building this app for a faucet store or brand, we’d ensure our images were all consistently photographed.
  2. Not all text prompts yield great results. Some are hilarious, some are fitting, and some are non-sequiturs. By constraining our search area to ~15,000 faucet images we’re dramatically limiting our possible answers. If we were building this general consumption we might limit or prompt users to use certain words and phrases. Or we could include many more images of our faucets in installed environments, which would provide additional context for CLIP to work with.
  3. Our app could be greatly improved by incorporating some domain knowledge, like finish options, pricing, design lines, and more. In our current app, we are limiting our results to the top result from each faucet brand. This is because brands have many variants of the same faucet. If we didn’t filter, our similarity query would only yield these variants. Adding additional filters or controls using product metadata would provide users with more control and yield better results.

Thankfully, these are small, surmountable problems! There’s no reason even small plumbing stores couldn’t roll out a tool like this on their websites. This took me a few hours to build, most of which was finding the images and waiting for llm to generate the embeddings.

Further: nothing is limiting us to faucets! Given a collection of images and a small dataset, you could build a finder app for any domain. Any store where products are evaluated for their aesthetics could dramatically benefit from such a feature.

Read the whole story
4 days ago
Boston, MA
Share this story

Geospatial SQL queries in SQLite using TG, sqlite-tg and datasette-sqlite-tg

1 Share

TG is an exciting new project in the world of open source geospatial libraries. It's a single C file (an amalgamation, similar to that provided by SQLite) which implements the subset of geospatial operations that I most frequently find myself needing:

  • Handling GeoJSON, WKT and WKB formats
  • Point in polygon checks
  • Shape intersection checks
  • Geospatial indexing to speed up the above

TG was released on Friday. I posted a note that "I think this could make the basis of a really useful SQLite extension—a lighter-weight alternative to SpatiaLite" in a couple of places...

... and Alex Garcia clearly agreed, because he built sqlite-tg over the weekend, and then packaged it up as a Python package, sqlite-utils and Datasette plugins, a Ruby gem, a Deno package and an npm package too!

It's still an early alpha, but it's actually very easy to try it out. Here's how I got it working in Datasette.


Since Alex released it as a Datasette plugin, you can run this:

datasette install datasette-sqlite-tg

Confirm installation with:

datasette plugins

This should just work. In my case I ran into a problem because I'd previously installed an earlier alpha and needed to upgrade the underlying sqlite-tg dependency, which I did like this:

datasette install sqlite-tg==0.0.1a6

This won't be necessary for you if you are installing it for the first time.

Trying it out

sqlite-tg can work with three formats: WKT, WKB and GeoJSON.

These queries can be used to convert one to the other. Here's how to convert a WKT bounding box around San Francisco to GeoJSON:

select tg_to_geojson('POLYGON((
  -122.51610563264538 37.81424532146113,
  -122.51610563264538 37.69618409220847,
  -122.35290547288255 37.69618409220847,
  -122.35290547288255 37.81424532146113,
  -122.51610563264538 37.81424532146113

This outputs (after pretty-printing):

  "type": "Polygon",
  "coordinates": [
      [-122.51610563264538, 37.81424532146113],
      [-122.51610563264538, 37.69618409220847],
      [-122.35290547288255, 37.69618409220847],
      [-122.35290547288255, 37.81424532146113],
      [-122.51610563264538, 37.81424532146113]

This is already useful: having an easily installed mechanism for converting between WKT and GeoJSON with a SQL query is a great thing to have.

Let's convert a point within San Francisco to WKB binary format:

select hex(tg_to_wkb('POINT(-122.4075 37.787994)'))



We can convert that back to GeoJSON like this:

select tg_to_geojson(x'0101000000AE47E17A149A5EC0DCB8C5FCDCE44240')

This is using SQLite's x'...' syntax to treat a hexadecimal string as a blob literal.

And here's how to confirm that our point exists within our polygon bounding box for San Francisco:

select tg_intersects('{
  "type": "Polygon",
  "coordinates": [
      [-122.51610563264538, 37.81424532146113],
      [-122.51610563264538, 37.69618409220847],
      [-122.35290547288255, 37.69618409220847],
      [-122.35290547288255, 37.81424532146113],
      [-122.51610563264538, 37.81424532146113]
}', 'POINT(-122.4075 37.787994)')

I'm mixing GeoJSON and WKT here. I get back:


Because the point and the polygon intersect. Try that with Times Square in New York:

select tg_intersects('{
  "type": "Polygon",
  "coordinates": [
      [-122.51610563264538, 37.81424532146113],
      [-122.51610563264538, 37.69618409220847],
      [-122.35290547288255, 37.69618409220847],
      [-122.35290547288255, 37.81424532146113],
      [-122.51610563264538, 37.81424532146113]
}', 'POINT(-73.985130 40.758896)')

And we get back:


Let's try something a bit more challenging.

Timezone lookups

I've worked with timezone lookups using SpatiaLite and Datasette before - I even wrote a tutorial about it.

I decided to try implementing a version of that on top of sqlite-tg.

I grabbed the latest release of from evansiroky/timezone-boundary-builder/ and unzipped it to get a combined.geojson file that starts like this:

  "type": "FeatureCollection",
  "features": [
      "type": "Feature",
      "properties": {
        "tzid": "Africa/Abidjan"
      "geometry": {
        "type": "Polygon",
        "coordinates": [

Then I loaded that into a SQLite database table using this sqlite-utils mechanism (explained in What’s new in sqlite-utils 3.20 and 3.21: --lines, --text, --convert).

sqlite-utils insert timezones.db timezones combined.json \
  --text --convert '
import json

def convert(s):
    data = json.loads(s)
    for feature in data["features"]:
        tzid = feature["properties"]["tzid"]
        yield {"tzid": tzid, "geometry": feature["geometry"]}
' --pk tzid

This Bash one-liner loads the entire combined.json file (140MB of it) into memory and then runs a snippet of Python to loop through all of those features and yield {"tzid": "...", "geometry": {...}} dictionaries for each timezone.

sqlite-utils then creates a table with this schema and inserts those records as JSON strings:

CREATE TABLE [timezones] (
   [geometry] TEXT

The resulting database file is 160MB. You can download a copy from here.

Here's a query that can be used to find the timezone for a latitude/longitude pair:

    'POINT (' || :longitude || ' ' || :latitude || ')',

I started Datasette like this:

datasette timezones.db

And ran that query using the http://localhost:8001/timezones page.

And it worked! It returned the correct timezone for the different points I tried.

The query takes around 700ms on my M2 MacBook Pro. That's not a great number - usable, but pretty taxing - but it's also not a huge surprise since this is the most naive implementation of this possible - it's doing a brute force geometry check against 160MB of JSON strings in the table.

sqlite-tg doesn't yet include support for indexing. TG provides some very interesting indexing mechanisms as part of the library.

And for added fun... I installed the datasette-geojson-map plugin and added select * to the query and I got this!

Screenshot of the timezone for New York rendered on a map below the SQL query

Read the whole story
6 days ago
Boston, MA
Share this story

Mastodon is easy and fun except when it isn’t

1 Comment and 5 Shares

After my last long post, I got into some frustrating conversations, among them one in which an open-source guy repeatedly scoffed at the idea of being able to learn anything useful from people on other, less ideologically correct networks. Instead of telling him to go fuck himself, I went to talk to about fedi experiences with people on the very impure Bluesky, where I had seen people casually talking about Mastodon being confusing and weird.

My purpose in gathering this informal, conversational feedback is to bring voices into the how should Mastodon be” conversation that don’t otherwise get much attention—which I do because I hope it will help designers and developers and community leaders who genuinely want Mastodon to work for more kinds of people refine their understanding of the problem space.

what I did

I posted a question on Bluesky (link requires a login until the site comes out of closed beta) for people who had tried/used Mastodon and bounced off, asking what had led them to slow down or leave. I got about 500 replies, which I pulled out of the API as a JSON file by tweaking a bash script a nice stranger wrote up on the spot when I asked about JSON export, and then extracted just the content of the replies themselves, with no names/usernames, IDs, or other metadata attached. Then I dumped everything into a spreadsheet, spent an hour or so figuring out what kind of summary categories made sense, and then spent a few more hours rapidly categorizing up to two reasons for each response that contained at least one thing I could identify as a reason. (I used to do things like this at a very large scale professionally, so I’m reasonably good and also aware that this is super-subjective work.)

None of this is lab-conditions research—sorry, I meant NONE OF THIS IS LAB-CONDITIONS RESEARCH—and I hope it’s obvious that there are shaping factors at every step: I’m asking the question of people who found their way to Bluesky, which requires extra motivation during a closed beta; I heard only from people who saw my question and were motivated to answer it; I manually processed and categorized the responses.

I didn’t agonize over any of this, because my goal here isn’t to plonk down a big pristine block of research, but to offer a conversational glimpse into what real humans—who were motivated to try not one, but at least two alternatives to Twitter—actually report about their unsatisfactory experiences on Mastodon.

Lastly, I’ve intentionally done this work in a way that will, I hope, prove illegible and hostile to summary in media reports. It’s not for generalist reporters, it’s for the people doing the work of network and community building.

A note on my approach to the ~data and numbers: It would be very easy to drop a bunch of precise-looking numbers here, but that would, I think, misrepresent the work: If I say that I found at least one categorizable reason in 347 individual replies, that’s true, but it sounds reassuringly sciency. The truth is more like of the roughly 500 replies I got, about 350 offered reasons I could easily parse out.” So that’s the kind of language I’ll be using. Also, I feel like quoting short excerpts from people’s public responses is fine, but sharing out the dataset, such as it is, would be weird for several reasons, even though people with a Bluesky login can follow the same steps I did, if they want.

got yelled at, felt bad

The most common—but usually not the only—response, cited as a primary or secondary reason in about 75 replies—had to do with feeling unwelcome, being scolded, and getting lectured. Some people mentioned that they tried Mastodon during a rush of people out of Twitter and got what they perceived as a hostile response.

About half of the people whose primary or secondary reasons fit into this category talked about content warnings, and most of those responses pointed to what they perceived as unreasonable—or in several cases anti-trans or racist—expectations for content warnings. Several mentioned that they got scolded for insufficient content warnings by people who weren’t on their instance. Others said that their fear of unintentionally breaking CW expectations or other unwritten rules of fedi made them too anxious to post, or made posting feel like work.


  • Feels like you need to have memorized robert’s rules of the internet to post, and the way apparently cherished longtimers get hostile to new people
  • i wanted to post about anti-trans legislation, but the non-US people would immediately complain that US politics needed to be CWed because it wasn’t relevant”
  • I don’t know where all the many rules for posting are documented for each instance, you definitely aren’t presented them in the account creation flow, and it seems like you have to learn them by getting bitched at
  • Constantly being told I was somewhat dim because I didn’t understand how to do things or what the unwritten rules were.
  • I posted a request for accounts to follow, the usual sort of thing, who do you like, who is interesting, etc. What I got was a series of TED Talks about how people like me were everything that was wrong with social media.
  • sooooooo much anxiety around posting. i was constantly second-guessing what needed to be hidden behind a CW
  • the fact that even on a science server, we were being badgered to put bug + reptile stuff behind a CW when many of our online presences are literally built around making these maligned animals seem cool and friendly was the last straw for me

What I take from this: There obviously are unwelcoming, scoldy people on Mastodon, because those people are everywhere. I think some of the scolding—and less hostile but sometimes overwhelming rules/norms explanation—is harder to deal with on Mastodon than other places because the people doing the scolding/explaining believe they have the true network norms on their side. Realistically, cross-instance attempts to push people to CW non-extreme content are a no-go at scale and punish the most sensitive and anxious new users the most. Within most instances, more explicit rules presented in visible and friendly ways would probably help a lot.

In my experience, building cultural norms into the tooling is much more effective and less alienating than chiding. The norm of using alt-text for images would be best supported by having official and third-party tools prompt for missing alt-text—and offer contextual help for what makes good alt text—right in the image upload feature. Similarly, instances with unusual CW norms would probably benefit from having cues built into their instance’s implementation of the core Mastodon software so that posters could easily see a list of desired CWs (and rationales) from the posting interface itself, though that wouldn’t help those using third-party apps. The culture side of onboarding is also an area that can benefit from some automation, as with bots on Slack or Discord that do onboarding via DM and taggable bots that explain core concepts on demand.

couldn’t find people or interests, people didn’t stay

A cluster of related reasons came in at #2, poor discoverability/difficulty finding people and topics to follow, #4, missing specific interests or communities/could only find tech, and #7, felt empty/never got momentum. I am treating each group as distinct because I think they’re about subtly but importantly different things, but if I combined them, they’d easily be the largest group of all.

People in the poor discoverability” group wrote about frustration with Mastodon features: how hard it was to find people and topics they wanted to follow, including friends they believed to already be on Mastodon. They frequently also said they were confused or put off by the difficulty of the cross-server following process as secondary reasons. Several people wrote about how much they missed the positive aspects of having an algorithm help bring new voices and ideas into their feeds, including those that they wouldn’t have discovered on their own, but had come to greatly value. Another group wrote about limited or non-functional search as a blocker for finding people, and also for locating topics—especially news events or specialist conversations.

The missing specific interests or communities” group wrote about not finding lasting community—that the people and communities they valued most on Twitter either didn’t make it to Mastodon at all, or didn’t stick, or they couldn’t find them, leaving their social world still largely concentrated on Twitter even when they themselves made the move. Several also noted that tech conversations were easy to find on Mastodon, but other interests were much less so.

The felt empty” group made an effort to get onto Mastodon, and in some cases even brought people over with them, but found themselves mostly talking into a void after a few weeks when their friends bailed for networks that better met their needs.


  • For me, it was that Mastodon seemed to actively discourage discoverability. One of the things I loved most about Twitter was the way it could throw things in front of me that I never would have even thought to go look for on my own.
  • I feel like every time I try to follow a conversation there back to learn more about the poster I end up in a weirdly alien space, like the grocery store on the other side of town that’s laid out backwards
  • It seemed like it needed to pick a crowd, rather than discover new ones. Fewer chances at serendipity.
  • I also remember trying to follow instructions people posted about simple” ways to migrate over your Twitter follows/Lists, & none of them really worked for me, & I got frustrated at how much time I was spending just trying to get things set up there so I wasn’t completely starting from scratch
  • Mastodon was too isolating. And the rules made me feel like the worst poster.
  • Quote-replies from good people giving funny/great information is how I decide are important follows.
  • Discoverability/self promo is limited & typing out 6 hashtags is annoying. # being in the actual posts clutter things (unlike cohost/insta).
  • Difficulty in finding new follows was high up for me. But even once I got that figured out, it was a pain to add new people to follow if they weren’t on my instance.
  • finding people you want to follow is hard enough. Adding in the fact that if you joined the wrong server you might never find them? Made it seem not worth the trouble.
  • I couldn’t really figure out how to find people and who was seeing what I posted; I was never sure if I had full visibility into that
  • the chief problem was an inability to find a) my friends from Twitter who were already there and b) new friends who had similar interests, both due to the bad search function
  • Just didn’t seem active enough to feel worth learning all the ins and outs.

What I take from this: Mastodon would be much friendlier and easier to use for more people if there were obvious, easy ways to follow friends of friends (without the copy-paste-search-follow dance). Beyond making that easier, Mastodon could highlight it during onboarding.

Making it easy to search for and find and follow people—those who haven’t opted out of being found—would also be tremendous help in letting people rebuild their networks not just when coming from elsewhere, but in the not-that-rare case of instances crashing, shutting down, or being defederated into oblivion, especially since automatic migration doesn’t always work as intended.

Missing replies also feed into this problem, by encouraging duplicate responses instead of helping people find their way into interesting conversations and notes—a social pattern that several people mentioned as something they prize on more conversationally fluent networks.

too confusing, too much work, too intimidating

The next big cluster includes group #3, too confusing/too much work getting started, group #5, felt siloed/federation worked badly, and group #7, instance selection was too hard/intimidating.

A lot of people in the responding group found the process of picking an instance, signing up, and getting set up genuinely confusing. Others understood how to do it, but found it to be too time-consuming, or too much work for an uncertain return on investment. A couple of people had so many technical errors getting signed up to their first instance that they gave up. Several mentioned that they were so flooded with tips, guides, and instructions for doing Mastodon right that it seemed even more confusing.

Many found the idea and practice of federation to be confusing, offputting, or hostile; they cited difficulties in selecting the right” instance and shared stories about ending up on an obviously wrong one and then losing their posts or having migration technically fail when they moved. Several explicitly used the words silo” or siloed” to describe how they felt trying to find people who shared their interests and also, I think crucially, people who didn’t share special interests, but who would be interesting to follow anyway. (This is obviously intimately tied to discoverability.)

Several brought up patchwork federation and unexpected or capricious defederation. Side conversations sprang up over how difficult people found it to pigeonhole themselves into one interest or, conversely, manage multiple accounts for multiple facets of their lives.


  • My Twitter friends joined various Mastodon servers that didn’t talk to each other and I gave up on trying to figure it out.
  • I’m tech savvy and have found mastodon simply opaque. I’ve set up 4 accounts, each on a different server, and don’t know how to amalgamate all the people I’m following everywhere (assuming all those servers federate with each other).
  • It was the thing where people had to make whole twitter threads just to explain how to sign up
  • the federation model is a mess and it’s impossible to use. i’ve been using computers all day every day since the 90s and mastodon makes me question whether i’m actually good at them
  • discovered I was on some kind of different continent from my friends, and could not follow them, nor they me. Immediately felt frustration and disgust and never looked back.
  • I’m tech savvy and have found mastodon simply opaque. I’ve set up 4 accounts, each on a different server, and don’t know how to amalgamate all the people I’m following everywhere
  • I was told picking a server didn’t matter. Then it turned out it actually mattered a great deal for discoverability. Then I’m told migrating is easy’, which is just a straight up lie.
  • Just 100 tiny points of friction for little return

What I take from this: I agree with these people, and I think all fedi projects meant for a broad audience should focus on fixing these problems.

too serious, too boring, anti-fun

People in this category talked about a seriousness that precluded shitposting or goofiness, and a perceived pressure to stay on topic and be earnest at all times.

  • It felt like the LinkedIn version of Twitter - just didn’t have any fun there
  • It feels overly earnest and humorless — I don’t consider myself a particularly weird or ironic poster but I want some of those people around saying funny stuff, you know?
  • And in the occasional moments where I do feel like being a little silly & humorous, I want to be in a crowd that will accept that side of me rather than expecting a constant performance of seriousness!
  • it just didn’t have as much fun or joy as early Twitter and Bluesky
  • ultimately, I just bounced off of the culture, because it wasn’t banter-y and fun. It feels too much like eating your vegetables.

What I take from this: Honestly, I think this is the most obvious culture clash category and is less something that needs to be directly addressed and more something that will ease with both growth and improved discoverability, which will help people with compatible social styles find each other. I think the other piece of this is probably the idea of organizing people into interest-based instances, which I think is fundamentally flawed, but that’s a subject for another time.

complicated high-stakes decisions

There’s a meta conversation that is probably unavoidable, and that I’d rather have head-on than in side conversations. It’s about what we should let people have, and it shapes the discourse (and product decisions) about features like quote posts, search, and custom feeds/algorithms—things that are potentially central in addressing some of the problems people raised in their replies to my question on Bluesky.

Broadly speaking, in the landscape around and outside of the big corporate networks, there are two schools of thought about these kinds of potentially double-edged features.

The first, which I’ll call Health First, prefers to omit the features and affordances that are associated with known or potential antisocial uses. So: no quote-posts or search because they increase the attack surface afforded to griefers and nurture the viral dynamics that drive us all into a sick frenzy elsewhere. No custom algorithms because algorithms have been implemented on especially Facebook and YouTube in ways that have had massive and deeply tragic effects, including literal genocide affecting a million adults and children in Myanmar whose lives are no less real than yours or mine.

The second, which I’ll call Own Your Experience, states that people, not software, are responsible for networked harms, and places the burden of responsible use on the individual and the cultural mechanisms through which prosocial behavior is encouraged and antisocial behavior is throttled. So: yes to quote-posts and search and custom feeds, and just block or defederate anyone using them to do already banned things, like harassment or abuse or the kind of speech that, given the right conditions, ignites genocide.

At their simplest, I don’t like either of these positions, though they both get some things right. The Own Your Experience school doesn’t really grapple with the genuinely terrifying dynamics of mass-scale complex systems. And I don’t think the Health First school has come to terms with the fact that in an non-authoritarian society, you can’t make people choose networks that feel like eating their vegetables over the ones that feel like candy stores. Even most people who consciously seek out ethically solid options for their online lives aren’t going to tolerate feeling isolated from most of their peers and communities, which is what happens when a network stays super niche.

From where I stand, there are no obvious or easy answers…which means that people trying to make better online spaces and tools must deal with a lot of difficult, controversial answers.

If I had to pick a way forward, I’d probably define a target like, precisely calibrated and thoughtfully defanged implementations of double-edged affordances, grounded in user research and discussions with specialists in disinformation, extremist organizing, professional-grade abuse, emerging international norms in trust & safety, and algorithimic toxicity.”

If that sounds like the opposite of fun DIY goofing around on the cozy internet, it is. Doing human networks at mass scale isn’t a baby game, as the moral brine shrimp in charge of the big networks keep demonstrating. Running online communities comes with all kinds of legal and ethical obligations, and fediverse systems are currently on the back foot with some of the most important ones (PDF).

this post is too long, time to stop

Right now, Mastodon is an immense achievement—a janky open-source project with great intentions that has overcome highly unfavorable odds to get to this point and is experiencing both growing pains and pressure to define its future. If I were Eugen Rochko, I would die of stress.

I don’t know if Mastodon can grapple with the complexities of mass scale. Lots of people would prefer it didn’t—staying smaller and lower-profile makes it friendly to amateur experimentation and also a lot safer for people who need to evade various kinds of persecution. But if Mastodon and other fedi projects do take on the mass scale, their developers must consider the needs of people who aren’t already converts. That starts by asking a lot of questions and then listening closely and receptively to the answers you receive.

Read the whole story
7 days ago
Boston, MA
63 days ago
Washington, DC
Share this story
1 public comment
62 days ago
Mostly the comments she collects here make me glad the people making them bounced
Epiphyte City

Why I'm making a big bet on nonprofit community news – NowKalamazoo

1 Share
Read the whole story
9 days ago
Boston, MA
Share this story

Keeping public records secret is costing Mass. state and local agencies

1 Share
Read the whole story
10 days ago
Boston, MA
Share this story

How often do men think about ancient Rome? Quite frequently, it seems.

1 Share

Add to your saved stories

It’s been almost 2,000 years since the Roman Empire reached the historic peak of its power. But many men still contemplate it — quite a lot.

A new social media trend prompting women to ask the men in their lives how often they think about ancient Rome reveals that it crosses the minds of many men on a weekly basis. Even daily. Or more — to the surprise and confusion of their loved ones.

“Three times a day,” answered one woman’s fiancé in a TikTok video. “There’s so much to think about,” he explained, eliciting a stunned look into the camera from his soon-to-be wife.

“They built an entire world-dominating society,” another man exclaimed when asked by a bewildered-looking woman to justify why he contemplates ancient Rome.

“Actually I was just having a conversation about their aqueducts and the fact that they had concrete that could harden. … How the hell did you know that?” answered another person who said they think about ancient Rome “at least once a day” in response to the question, in a screenshot shared on TikTok.

But why? Sure, the Roman Empire boasted a dominion that stretched across the entire Mediterranean basin and far beyond. It was a flourishing laboratory of works of art and engineering that continue to astound. And it operated under a political system that still forms the basis of many modern counterparts. (At least, that’s what this reporter contemplates, maybe once a fortnight.)

But why does there seem to be a gender divide in who is daydreaming about ancient Rome today?

According to historians, one explanation could be that Western societies have historically overemphasized the aspects of Roman history that are associated with masculinity in the popular imagination.

The first thing that comes to the mind is “an image of the Roman legion, the imperial eagle and that sort of military aspect — along with gladiators, which has a long association with masculinity and power,” Hannah Cornwell, a historian of the ancient world at Britain’s Birmingham University, said in a telephone interview Thursday.

Since at least the 19th century, she said, historians have tended to view ancient Rome through the prism of politics and warfare, in part as a result of their reliance on “elite, masculine” sources.

“That has informed popular culture,” she said. “And yet — it’s then missing out on so much.”

The slew of videos on TikTok appear to have been prompted by Artur Hulu, a 32-year-old Roman reenactor and history influencer from Sweden who has earned a large following.

Known as “Gaius Flavius” online, where he posts videos of himself as a Roman legionnaire and performs comedy sketches as a gladiator, Hulu wrote on Instagram: “Ladies, many of you do not realize how often men think about the Roman Empire. … You will be surprised by their answers!”

In an interview, Hulu said he posed the question after noticing a disparity between men and women in their interest in Roman history and seeing other creators discuss similar trends. Hulu’s Roman reenactment society, for example, involves 16 men and two women, he said. “It is heavily male dominated.”

The disparity in interest dates back hundreds of years, Hulu believes. “The men during the Renaissance did it. The Founding Fathers also thought about the Roman Empire. Once you get enough exposure to the Roman Empire, whether it’s the military stuff or the law, you start to see it everywhere,” he said. “I can’t remember a day when I didn’t think about the Roman Empire. … It just fascinates me how different but also how similar the Roman Empire is to our world today.”

And “Gaius Flavius” is not alone. One Reddit user, when prompted by his wife, said he thinks about the Roman Empire a few times a week.

“So many things in our lives today were influenced by the Roman Empire,” he explained in a post. “Language, food, philosophy, architecture, war, entertainment, sports, mythology, culture. … I don’t actively focus on the Roman Empire but the connection always pops into my head as I go about my daily life.”

Historians insist that Rome itself isn’t just “guy stuff,” as some men in videos called it.

“Ancient Rome was of course patriarchal and violent,” Lewis Webb, a historian of ancient Rome at Oxford University, wrote in an email. “But it was also a diverse place: there were numerous forms of masculinity, women could have agency and power, and there were multiple gender expressions and identities, as well as various sexualities.”

Historian Cornwell also points out that Sextus Varius Avitus Bassianus, or Elagabalus, the Roman emperor from A.D. 218 to 222, is frequently presented in ancient sources as experimenting with cross-dressing.

“Even when you get to some of the emperors, they’re doing weird and wacky things by modern conceptions of what a man is,” Cornwell points out. There were also female gladiators. “The Romans do have a clear sense of what is masculine and feminine, but within that there is an awful lot of flexibility. Which sometimes we often forget about,” she said.

And she herself, of course, thinks about the Roman Empire quite a lot — on a daily basis, as it is her chosen field. Her partner recently told her he thinks about it “1.6 times a month.”

So what is a healthy amount?

“Goodness,” she said, laughing. “I’d say it really depends on what you’re thinking about.”


A previous version of this article incorrectly stated the time period during which Roman emperor Elagabalus reigned. He was emperor from A.D. 218 to 222, not 218 to 222 B.C. This article has been corrected.

Read the whole story
14 days ago
Boston, MA
Share this story
Next Page of Stories