[draft] snip-0006

engagement-based zapping

Abstract

This proposal describes an opt-in feature allowing users to automatically zap the content they engage, thereby enabling zero-effort, engagement-based zapping.

Motivation

As a multi-sided marketplace, Stacker News (SN) thrives given a healthy ratio of quality creators to discerning and active spenders. A creator is motivated to post content on SN if they can expect reasonable compensation in proportion to the quality of their posts. Correspondingly, spenders are motivated to consume and reward content on SN if a sufficient number of creators post enough quality content. The more content of sufficient quality, the more likely a spender will engage and return. The more spenders rewarding at a sufficient level, the more likely a creator will post and return. While a single click to zap sets an upper bound on the effort a spender takes to reward creators, the programmability of Lightning enables engagement-based spending thereby reducing the effort to zero1.
Among the capabilities of an “internet money” is the ability to extend usage-based2 business models across the entire digital economy. As examples, Fountain.fm3 allows podcast listeners to compensate creators per minute listened, and SuredBits4 sold a feed of historic crypto prices on a pay-per-feed-item basis. The advantage of a usage-based business model for a community like SN is an increased flow of capital (strongly correlated with marketplace growth), thereby incentivizing more creation, thereby increasing the likelihood of active engagement, and so contributing to a self-reinforcing network effect increasing overall market health5.
The aim of this snip is to pump such a network effect and thereby contribute to the growth of SN6.

Discussion

The essence of engagement-based zapping (EBZ) is that as a user engages with content on SN, each unit of content engaged will be zapped some reward after a settlement delay until an allocated EBZ budget is depleted. For example, in the simplest case, the user's zap default (as defined in their settings) could be zapped instantly (a settlement delay of 0) until they run out of sats (i.e. their EBZ budget is the entirety of their remaining balance).
While suitable as an mvp, there are a few downsides to this simple EBZ model. First, users may want to set aside only a portion of their total sats for EBZ. Second, a fixed size reward combined with instant settlement does not allow a user to zap content as a function of the "amount" they engaged.
Something that could be interesting would be for the amount of time you spend on the post.
  • Ben Carman7
Time is money. How could we enable EBZ as a function of the time spent engaging? We need to:
  • effectively measure engagement
  • delay settlement in order to accumulate engagements
  • sort accumulated engagements by engagement amount
  • distribute the budget across the content engaged as a function of the sort
Let's take each in turn.

Measuring Engagement

The two units of content on SN are posts and comments. The two main post types are discussions and links6. Users engage with posts and comments through one or more of zapping, reading, commenting, and navigating.
Users can engage with any post type by commenting. Additionally, discussion posts can be engaged through reading and link posts engaged by navigating. Moreover, comments can be engaged themselves by commenting (i.e. replying), and both posts and comments can be engaged through zapping. This taxonomy of content type and engagement type can be captured in the following table.
EngagementDiscussion PostsLink PostsComments
zapXXX
readX
commentXXX
navigateX
The first step in enabling engagement-based zapping is to record which content a user enages. This requires specifying a measure for whether a user has engaged a unit of content or not. We propose two kinds of engagement measures: discrete and continuous.

Discrete Engagement Measures

To measure engagement discretely, we specify a predicate that takes as parameters the content engaged, the type of engagement, relevant context and return true or false.
The following is a table of discrete engagement measures for each engaggement type.
Engagement TypePredicate
zapthe user zapped >0 sats
readthe user visited the post for >0 seconds
commentthe user commented >0 chars to a post or comment
navigatethe user clicked on the link
Since engagement is a boolean value given a disrete measure, there is no way to compare a user's engagement across content to determine which content they engaged with more. Instead, we need to introduce continuous engagement measures.

Continuous Engagement Measures

We can easily extend our discrete engagement measures to continuous ones by transforming our predicates into time valued functions.
Engagement TypeMeasure
zapthe number of sats zapped times a time weight
readthe number of seconds a user spent on a post
commentthe number of seconds a user spent writing
navigatethe number of seconds a user spent offsite
As time valued functions, our measures now allow us to compare whether, say, a user engaged a post they read more than they engaged a comment they replied to. The downside of continuous measures is the complexity of implementation. Naive ways of tracking time can easily lead to pathaological results. Let's discuss some less-than-naive implmentations of engagement for the above types.

zap

Whether we should auto-zap based on zapping seems like a user preference that many would not opt-in to. If they did, the simplest implementation would be to weight each sat zapped by a single millisecond. Zaps would likely always rank low compared to other forms of engagement.

read

Starting a timer when a user opens a discussion post and measuring the time spent on the page is too naive since a page left open when a user is afk would count as high engagement. Instead, the time at which the post was opened should be tracked and a timer set whose moment of expiry represents the end of engagement. The end-of-engagement timer would be debounced by any scroll events. A suitable delay for the timer could be determined by the total number of characters on screen - as determined by the intersection observer api8 - divided by the average characters readable in a minute9.
Once the end-of-engagement timer expires, if the user begins scrolling again the measurement can be resumed and added to the total time engaged.

comment

The timestamp of the first keypress should be noted and the timestamp of the most recent keypress updated as the comment is typed. Once the comment is submitted, the time of the final keypress minus the time of the first keypress represents the total engagement time.
Perhaps the hardest of all the engagement types to track, a timestamp could be stored if a user clicks the link and the page goes out focus and then another timestamp taken once the page comes back into focus. The difference between the two could be treated as representing the time spent engaging the link but this seems too naive. Navigation engagement could also be represented by a constant amount of time.

Engagement Tracking

State concerning the current EBZ period should be tracked, including each unit of engagement over the EBZ period.

Aggregate Engagement

At the end of the EBZ period, all engagement amounts related to the same unit of content should be summed together to represent a user's total engagement with a unit of content.

Sorting Engagement

Each unit of content engaged should be sorted by a user's total engagement, thereby ordering all units of content engaged in the EBZ period from greatest to least engaged.

Filtering Engagement

Users could specify whether to distribute their EBZ budget across all content engaged or simply the top n engaged contents.

Reward Functions

Finally, the entire EBZ budget can be allocated according to a curve. For example, a constant disbursement would distribute the budget evenly to all qualifying contents. A normalized linear disburesement would allocate most of the reward to the most engaged content and then linearly reduce the reward for subsequent contents. A normalized inverse logarithmic (steeply down and to the right) or normalized reflected logarithmic (shallowly down and to the right) would strongly concentrate rewards with the first or the first few most engaged contents and reduce subsequent rewards substantially.

example normalized inverse logarithmic reward function

import { payout } from './payout' async function normedInverseLogRewards(budget = 1, contents = []) { const norm = contents.reduce((norm, _, i) => norm + (1 / Math.log(i + 2)), 0) const disbursements = contents.map((content, i) => [content, (budget / norm) / Math.log(i + 2)]) for (const [content, disbursement] of disbursements) await payout(content, disbursement) }

UX

Settings

Users should opt-in to EBZ from their settings. Users should be able to set the size of their EBZ budget in sats, initially 10 times their default zap amount. Users should be able to set the amount of sats zapped per discrete engagement, initially set to their default zap amount. Users should be able to set the period at which their EBZ budget refreshes, initially set to daily. Users should be able to set whether manually zapped sats should count against their EBZ budget, initially set to true.

Comments

If EBZ is enabled, when a user comments there should be an option to turn EBZ off for that particular comment.

Notes

Footnotes

  1. or more accurately, shifting the effort to acquiring sats and configuring your auto-spend
  2. usage of SN amounts to engagement of various kinds
  3. with SN’s sybil resistance (pay-to-post) acting as a control on junk (click-bait) content seeking to drain liquidity[&6]: This snip can be expanded in the future to cover polls, bounties, and jobs
  4. a secondary aim is to increase the tranche socialist capabilities of SN, see #406210
1845 sats \ 5 replies \ @joda 15 Feb
I kinda skimmed and mostly like the idea of auto-zapping similar to Nostr clients. But it's important to remember that zaps are money, and what you are effectively (literally) doing is TAXING engagement.
You're also dipping well into the area of privacy concerns with this level of tracking.
Also, I do not think time is a good way to measure engagement. For various reasons, but mainly because I don't want some part of my brain to be constantly trying to estimate how much time I'm spending while reading. That's just stressful. It also "taxes" people who read more slowly, or thoughtfully.
reply
i’m also concerned about time-based autozaps, and this week @k00b convinced me to reconsider my views on click-based autozaps too.
comment-based autozaps give stackers full control of where their money goes (without limiting their browsing/curiosity) and seem like the easiest to implement.
comment-based autozaps may also have the effect of improving discourse online (especially if the feature was a default setting for all).
if you’re giving someone money every time you respond to them, this may stop trolls and chronic reply-guy complainers from creating low-value comments without stopping well-meaning critics from correcting errors or honestly pushing back on ideas.
reply
435 sats \ 3 replies \ @joda 15 Feb
Good point.
I also failed to bring up the vast wealth disparity. Many of us can easily drop hundreds or thousands of sats, but for some people that is a substantial investment. We certainly want to tax trolls and spam, but not at the expense of muting the voices of the poor.
I understand it would be "opt-in" (and I would), but at some point it might be converted to "opt-out" (default opted in). Or even mandatory with a minimum 1 Sat or something...
reply
yup, don’t think there should be a high cost associated with these autozaps either.
just the idea that a troll has to pay money (however little) directly to the person they’re attacking might be enough to make them think twice.
reply
445 sats \ 1 reply \ @ek 16 Feb
just the idea that a troll has to pay money (however little) directly to the person they’re attacking might be enough to make them think twice.
Sounds like what you want is to apply what we planned for DMs to comments as well: custom fees for replies. For DMs, I envisioned that it should be possible to set different fees per user (give some users a discount for DMing you) so if you feel like someone is trolling you, you could punish them with higher fees if they are replying to you.
Details and UX might be tricky though.
reply
similar, though i was imagining the fee would be determined by the commenter rather than the OP.
that means the fees can just be inherited from each commenter’s default zap settings rather than introducing a new UX element.
reply
For aggregate rewards, I could see the curve a stacker uses to disburse rewards becoming a part of their identity on the site. Are you an inverse exponential or constant rewarder? Maybe we could create little badges with pictures of the curves that would show up on your posts.
reply
I appreciate the thought that went into the snip proposal, and it sparks ideas. The downside to this is the level of tracking that has long been a staple of the ad industry, and this association is not aligned with the ethos of Bitcoin. Taxing time engagement also has issues. Possibly paying with final settlement while you are afk sounds like a bad idea in principle. If there is an afk toggle, that will be one more thing to remember that adds stress.
What about starting with something super simple like offer a configurable auto-zap feature for every article opened? I would opt in for that.
reply
I appreciate the goal of boosting engagement and rewarding quality content, but I have some concerns regarding privacy and the focus on time spent. User tracking feels a bit intrusive, and equating time with engagement could incentivize long-winded posts over concise, insightful ones. Could we explore alternative models?
  • Comment-based micro-zaps: Each comment you leave automatically triggers a small zap to the original post/comment. This promotes deeper discussions and rewards those who add value to conversations.
  • Reaction-based zapping: Users could use different emojis to express reactions, potentially tied to small zap amounts like appreciation, insightfulness, or even disagreement. This provides nuanced feedback for creators.
reply