A micro-review lexicon "is/not"

A few weeks back I posted some thoughts on not using 5-star review mechanics for ATStore reviews, tried to distil what a good micro-review mechanism should do, and offered my pet “is/not” micro-review mechanism.

That (longer) post on Github

I pontificated earlier (:sweat_smile:) about the challenge of using a 5-star review system (anywhere, but particularly on the ATStore). I’d love to see us embrace other mechanisms that could be more informative on the breadth of what the Atmosphere offers, and might even provide a lexicon that other Atmospheric apps might lean on for reviews too!

The big challenges I see with written & 5-star reviews:

  • As Ariel mentioned, stale reviews mean you often need to pay close attention to when the review was and what changed on the platform since — who has time for that when browsing lots of potential things?
    • Having a time component to how reviews are surfaced seems important
  • It requires a bunch of effort from a potential reviewer to summarize the entire app, and to reduce their mixed views into a single output; which means folks either don’t bother, or pick a particular aspect to shower praise or criticism upon.
    • Making it super easy and fast for anyone to offer a high-context review (with scope for conflicted feelings) would be excellent… if possible
  • If folks find something they don’t like about an app, the reviews can become a place to ‘shout into the void’ in a way that can appear overly entitled, stir discontent, and produce pile-ons, when it’s a reasonable & genuine frustration (if perhaps ungracefully framed)
    • Finding a way to channel frustration into something owners can channel into improvement seems important
    • Ensuring there’s good context as to what a reviewer should expect from leaving a review seems important
  • In small communities, and especially in open systems like atproto, your rating is also a means of support — a “critique in private, praise in public” kinda thing — so early ratings can seem rather one dimensional or fake
    • Making sure there’s a way to offer balanced feedback without being unsupportive seems important
  • There are many interesting critiques of 5 star review systems, often pointing out how folks often vote 5 for ‘good’, 1 for ‘bad’ and 4 for ‘excellent except for that one thing I want’, making it very hard to get useful data out, even when there are lots of respondents.
    • Gathering data that maximises the ability for useful analysis seems important
  • A single thing often has different value in different contexts. 5 stars for novelty — I want to support this, 1 star for dependability — I wouldn’t use it foundationally, yet.
    • Allowing expression for nuance, without inflating complexity, seems important

What (I think) people want from a review system:

  • To know the thing is worth investing a little time in (via social proof)
    • it does what it says
    • it’s not scammy/doesn’t exhibit any dark patterns
  • To evaluate A vs. B, if there are two similar things
  • To have expectations set. Eg. a thing trying to be artistic and beautiful at the expense of broad feature set vs. a thing trying to be fully featured at the expense of good looks
  • … (probably much else not in my head right now :sweat_smile:)

To that end, here’s a pet idea I’ve had knocking around for a long time, that feels rather suited to atproto, that I call “is/not” reviewing.

  • There is an open list of adjectives a review platform has defined for writing reviews.
  • A reviewer is offered a handful of them* as three-way toggles; eg. “beautiful” → “is beautiful”, “is not beautiful” or not asserted (the default)
  • The reviewer picks the ones they have strong opinions about, and offers that “thumbs-up/thumbs-down” verdict on each of the adjective dimensions.
    • You could capture a text review too, if you like
  • The review system then aggregates these votes in any number of dimensions: how polished it is (is beautiful/is clean/is not work-in-progress), how fun it is (is exciting, is not boring, is artistic), and so on.

You can then extend this as the dataset grows

  • Paired with a “Like” button, you can extract that a particular person always rates “is beautiful” for the things they Like → now you can up-rank things specifically marked “is beautiful” for that person
  • You can use different languages for the adjectives, and map them in a non-1:1 fashion; “es rico” could boost an “is expensive” signal in Spain, but an “is delicious” signal in Latin America.
    • (Hell; with enough data you can eventually ignore what the tag’s text is entirely, and just use clustering algorithms to see how a person’s ratings fit in with the wider ecosystem)

I feel this system could be particularly good across the Atmosphere particularly (given this kind of methodology could be a lexicon used across review platforms too!) — but this idea hasn’t seen the light of day yet, please critique and adapt it; I’d love to hear your thoughts!


Generally: has the ATStore given any thought to other rating/review mechanisms? Do you have any other goals for what you have or will implement?


After a prompt from @erlend.sh (thanks!) figured I’d break that idea out here, including a possible lexicon, and ask for feedback — particularly from folks who’ve worked with the psychology & statistics of review systems before!

Here’s my proposed lexicon for micro reviews that could replace any 5-star mechanism (the justification is in the expander box above).

I’d love some feedback — I’ll be happy to try out this lexicon on its own (marque.at is calling :sweat_smile:) but if it’d be useful for others I’d happily get it ready for the lexicon community.


An example review record, declaring that the ATStore app entry “is trustworthy”:

{
  "$type": "community.lexicon.review.isnot",
  "subject": {
    "uri": "at://did:web:atstore.fyi/community.lexicon.app.entry/at-store-tid",
    "cid": "bafywhateverwhateverwhateverwhateverwhatever"
  },
  "adjective": "trustworthy",
  "direction": 1,
  "createdAt": "2026-05-17T14:38:51.423Z"
}

With prototypey format lexicon (for readability here) like this:

import { lx } from "prototypey";

export const review = lx.lexicon("community.lexicon.review.isnot", {
  main: lx.record({
    key: "tid",
    description: "A lightweight 'is/not' review of something represented by another atproto record",
    record: lx.object({
      subject: lx.ref("com.atproto.repo.strongRef", {
        required: true,
        description: "The subject of this is/not review",
      }),
      adjective: lx.string({
        required: true,
        minGraphemes: 1,
        maxGraphemes: 16,
        maxLength: 160,
        description: "An adjective that the record publisher believes describes the subject either in the positive or negative direction.",
      }),
      direction: lx.integer({
        enum: [-1, 0, 1],
        required: true,
        description: "Whether the record publisher thinks the subject is the adjective (1), is not the adjective (-1), or is explicitly making no comment (0).",
      }),
      createdAt: lx.string({ required: true, format: "datetime" }),
    }),
  }),
});

First thoughts on what I’ve suggested here:

  • Repo owners can use whatever adjectives they like, but an AppView ingesting them would only pay attention to the ones they were interested in.
  • I’ve gone with enum for the direction because it should be a permanently closed set. We could leave it open to allow for +2/-2 for “is really trustworthy” or similar.
  • strongRef for the subject, so AppViews can make their own choice as to how to handle a review of a record which has changed since it was issued.
  • I’ve explicitly made this one-adjective-per-record; I could also have made it one-review-per-record (containing an array of adjective/direction pairs) — I think this is the right approach, as my opinion about whether something “is funny” may change independently of whether it “is good”.
3 Likes

I know I’m 3 months late to this post but I was thinking about review-related lexicons for an app idea and I came across this one. I really like what you’ve proposed here!

I’ve gone with enum for the direction because it should be a permanently closed set. We could leave it open to allow for +2/-2 for “is really trustworthy” or similar.

I personally like the option to go +2/-2 and if app views want to ignore that then that’s their choice.

strongRef for the subject, so AppViews can make their own choice as to how to handle a review of a record which has changed since it was issued.

Still learning best practices for lexicon definitions. I think this is a great plan to go with strongRef as that could definitely be useful information.

I’ve explicitly made this one-adjective-per-record; I could also have made it one-review-per-record (containing an array of adjective/direction pairs) — I think this is the right approach, as my opinion about whether something “is funny” may change independently of whether it “is good”.

Agree that one-adjective-per-record is the way to go.


Since I’m still getting my head wrapped around the AT proto and how records work together in your example the subject is just the AT Store app itself that you’re saying is trustworthy? But then the subject could also be on of my blog posts or a restaurant I visited?

2 Likes

Nice! Thank you for the feedback — even with a delay it’s rekindled my interest :blush:

I’ll add the “it’s very…” and “it’s really not…” +2/-2 to the lexicon, as I know what you mean, it’s useful to have those extremes for emphatics!

I also saw your post here; if I put a trivial site up at isnot.at that let you create & manage your is/not micro-reviews, would that be interesting as a way to explore whether this approach works for you?

The biggest oddity here, I think, will be that you (currently) need an atproto-native thing to attach a review to. (Eg. This doesn’t currently support reviewing a film directly, or from IMDB, but it would let you attach a review to your popfeed.social record of watching a film.)

I think that’s the right divide (as it abstracts how to reference a thing to the place where it matters), but I’d be interested in your thoughts!

This is also where the strongref comes in; the uri part pointing to your “I watched ” popfeed record is what tells me you’re attaching tags to that film, the cid (a hash of the Popfeed record) asserts whether your Popfeed record has changed since you attached the is/not rating to it.

I think that’s small but useful; is/not can flag if your record has updated when you visit, and let you reconsider your tags, if your opinion on the thing has changed.

1 Like

if I put a trivial site up at isnot.at that let you create & manage your is/not micro-reviews, would that be interesting as a way to explore whether this approach works for you?

I wouldn’t oppose a tiny site but I think the convention and lexicon have value without that. I’m was thinking about just using this approach within my own site’s space/domain/area as I explore what an at proto review could start to look like. I’m curious what you had in mind for that site exactly. Without a fancy way to look up any arbitrary thing the UI wouldn’t do much unless I’m not thinking about it correctly.

The biggest oddity here, I think, will be that you (currently) need an atproto-native thing to attach a review to.

What you say is an oddity I read as valuable. This is part of what I think is really powerful with the architecture of the at proto. An isnot.review could become just a standard thing. We could all use it and link it to whatever we are building and it’s the same little bit of data everywhere. How that shows in the UI and what the apps do with it is another matter but it’s an agreed upon standard.


This week is pretty busy for me but I’ll try to get some basic reviews up under my own NSIDs for this.

1 Like

Main test I’m interested in seeing would be a fork of GitHub - ATProtocol-Community/ATStore · GitHub swapping out the star ratings with your system. Existing star ratings would be converted/interpreted as 1-2 stars = down vote and 3-5 stars = upvote.

1 Like

I love this idea. I have always been bothered by five star reviews and I feel like this is a much more holistic approach.

That being said ±2 with the option of neutral is kinda like a five star system but now it’s a five star system that you have to rate multiple times. Think those strongly agree, agree, neutral, disagree, strongly disagree questionnaires. Although this gives potentially useful data, it may increase the psychological burden on reviewers. If I had to give 6 five option reviews instead of one, I might forego reviewing or give rushed inaccurate answers.

I like that @erlend.sh pointed to the Steam store in the GitHub thread. Just a thumbs up or down is a much lower mental hurdle and one could pound through a few of those pretty easily. Somehow integrating a skip/I-don’t-know option into the UX could be helpful though I think we would have to be careful and clever about how we did that.

3 Likes

I can see your point on the ±2 ending up to be a masking of the original 5-point scale we intended to avoid. To me the key with this scale is the adjective, though. I know it adds a second input but to me a simple :+1: :-1: can be too small. I mean yes it’s clearly “good or bad” but I know I’ve definitely skipped giving reviews with those because my experience was murkier (for lack of a better word).

1 Like

Yeah; I’m seeing this as something that can adapt to “thumbs up thumbs down” with ease (is good/is not good), but also allows for flexibility for those who want to add more context.

For example, someone who uses this in passing might press the thumbs up and record ‘is good’; but then might want to add more context: is not scary (as a balance to a review I saw that said it was), is grindy (note that some may consider this negative, but it’s contextualised by ‘is good’).

To your point @sophie-isla.myatproto.social I also think there could be an (optionally authenticated) “suggestTags” query xRPC service, which could use an index of all reviews (and with better data science than I have immediate experience of) to suggest what adjectives are the ones most likely to be divisive, useful and/or informative for you to form an opinion on. “Others are divided on whether this game is scary or not; what’s your take?”


@arsdehnel I’m experimenting down the path of creating panproto ‘lenses’ for converting an atproto record into a subject for an is/not review. This extracts a title (“Valheim”), a type (“video-game”), and identifiers (“steam: 892970”) as well as the at-uri (I’d use g5 here) and the cid (can be ignored, but flags that the reviewed record has changed since it was reviewed).

I added these extra fields so a small amount of context is denormalised to the reviewers’ PDS, otherwise the record can be hard to work with in other contexts. I also think this means it’d be smart to allow multiple tags on a single review, reversing my original position of having a single adjective per record.

I think this means you could use it on your own site (with the nuance of multiple adjectives) to review anything without too much trouble!


@erlend.sh I reckon we have the pieces we need. Using the “good” adjective and a star → direction mapping of stars - 3 works (5 stars is “is really good”, 1 star is “really is not good”, 3 stars is the slightly odd mapping of “I explicitly do not have an opinion on this”, but that kinda works). Plus I can add an ‘is awesome’ for a favourite too. I’ll build an importer :slight_smile:


I’m most of the way through building a demo site at isnot.at — I’m iterating on it quickly, and not intended for broad use yet, but the lexicon is up and you can paste in at at-uris of a number of supported types and get a review in there!

I’m implementing reading of the at-tags proposal too, so pasting in a supported URL works too; if anyone knows the ATStore folks, it’d be great if they could implement that, or anywhere else!

(Oops, this got long — sorry folks!)

2 Likes

I’ve made some progress, but haven’t figured out site navigation yet — so here are some useful pages if you’re exploring:

Homepage / — a rotating set of random sample single tags from reviews

Make a review /review — lets your drop in at-uris, or suggests from things others have reviewed, will also suggest adjectives soon too. Accepts ?subject=<at-uri> if you want to toy with connecting it to other sites!

List a person or item’s reviews /reviews/{did,handle,at-uri} — has a bunch of filters to explore. Interestingly, I think I may need to revisit how deeplinks might work, or make use of aturi’s links (any tips @dame.is?) , as I don’t have a good way to link back to a website from an at-uri. (Doubly fun if I can use someone’s preferred appview for a given link, if they’re logged in)

Import records /import — I’ve added a few for different records I use, but its customisable, and I’ll support other sites as folks request them, or I come across them :slight_smile:

2 Likes