npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@v0idd0/double-text-risk

v0.1.1

Published

double-text-risk — deterministic follow-up checker for dating, workplace, recruiter, client, support, family, and sales threads that scores whether another message adds value, should wait, switch channels, or stay unsent.

Readme

double-text-risk

License: MIT Node ≥18

Web app · Live compare page · Packaged compare brief · Deep Dive · Signal toolkit · npm · All tools · Contact


double-text-risk answers one narrow question:

Should you send this follow-up, wait longer, switch channels, or not send it at all?

It scores a drafted second text against two realities:

  • how long it has been since your last outbound message
  • how much pressure versus value the new message adds

The goal is not romance theatre. The goal is to stop weak stacked follow-ups before they cost leverage.

Why this exists

The paid product is tells, which reads what people leave unsaid across messages, people, and profiles.

But a lot of intent starts smaller:

  • "Is this too soon?"
  • "Does this read needy?"
  • "Am I following up again without saying anything new?"
  • "Should I text again or switch channels?"

double-text-risk is the free deterministic first pass for that moment.

That shows up outside dating too:

  • recruiter follow-ups after interviews or stalled scheduling
  • client and account-management nudges that risk sounding pushy
  • support threads where one more ping can escalate tension instead of resolving it
  • family or cofounder loops where repeated nudges start sounding reactive
  • sales follow-ups where "just checking in" adds no real value
  • vendor follow-ups where the thread is drifting and leverage matters
  • workplace threads where another ping may be weaker than a clearer channel shift

Web app

Use the live browser version here:

https://tells.voiddo.com/double-text-risk/?ref=double-text-risk-readme

Install

npm install -g @v0idd0/double-text-risk

Usage

double-text-risk --hours 30 "Just checking if you saw this."
cat followup.txt | double-text-risk --hours 18 --followups 1
double-text-risk --file followup.txt --hours 52
double-text-risk --json --hours 90 --followups 1 "Happy to leave this here if now is bad timing."

Example output

window: reasonable
risk:         4.2/10
timing:       7/10
pressure:     2.4/10
value:        6.6/10
channel shift:1.4/10

next step: send now
why: The delay is long enough and the wording adds enough value to justify one follow-up.
- Timing and usefulness both clear the bar for one measured nudge.

next:
Use tells when the real question is no longer one text, but the whole pattern between you and this person.
- quick next paid step: https://tells.voiddo.com/deep-dive/?ref=double-text-risk-cli
- recurring reads: https://tells.voiddo.com/?ref=double-text-risk-cli

What it scores

  • risk — overall chance the follow-up reads needier than useful
  • timing — whether the silence window justifies a new touch
  • pressure — how much the message pushes for attention
  • value — whether the text adds something concrete
  • channel shift — whether another text is weaker than a clearer channel

Inputs:

  • --hours — hours since your last outbound message
  • --followups — how many nudges you already sent after the original message

Good use cases

  • dating follow-ups
  • recruiter and interview follow-ups
  • client, support, and account-management follow-ups
  • family or cofounder check-ins that are slipping into pressure
  • vendor or partnership follow-ups where silence does not justify panic
  • sales nudges that risk sounding needy
  • workplace threads where you already know the draft, but not the timing
  • situations where you may need to move from text to a call instead of stacking another ping

Bad use cases

  • crisis, legal, or safety situations
  • deception detection
  • diagnosing the whole relationship
  • deciding whether someone likes you in general

If the real issue is the pattern over time, use tells.

Why not just use ChatGPT or Gemini?

Because the first question is operational, not poetic.

For this kind of timing call, deterministic heuristics have real advantages:

  • same input gives the same output
  • no API key
  • no prompt fiddling
  • no chance the model rewards clinginess with confidence

Then, once the problem becomes "what does this pattern mean?", the right upgrade is tells.

If you want the side-by-side positioning pages for browser or package traffic, use:

  • live compare page: https://tells.voiddo.com/double-text-risk/compare-chatgpt-gemini.html?ref=double-text-risk-readme
  • packaged compare brief: compare-chatgpt-gemini.md

Paid next step

When the one-text timing check is not enough:

  • Deep Dive$19 once for one loaded thread or one recurring person
  • Starter$14.99/mo for repeated message reading
  • Practitioner$99.99/mo for coaches, recruiters, mediators, trainers, support leads, or client-facing teams using this with clients

If the one-text score is not enough, the fastest paid handoff is usually Deep Dive:

https://tells.voiddo.com/deep-dive/?ref=double-text-risk-readme

If you still want the wider browser-first free path first:

https://tells.voiddo.com/signal-toolkit/?ref=double-text-risk-readme

Start with the live checker:

https://tells.voiddo.com/double-text-risk/?ref=double-text-risk-readme

Compare surface

  • live compare page for browser-first "double-text-risk vs ChatGPT / Gemini" traffic: https://tells.voiddo.com/double-text-risk/compare-chatgpt-gemini.html?ref=double-text-risk-readme
  • packaged compare brief for npm/GitHub readers deciding whether to install: compare-chatgpt-gemini.md

Use the packaged brief when the reader is already on GitHub or npm:

compare-chatgpt-gemini.md

Use the live compare page when the reader should stay in the browser flow:

https://tells.voiddo.com/double-text-risk/compare-chatgpt-gemini.html?ref=double-text-risk-readme

Related free checkers

If the problem is adjacent but not exactly "am I double texting?", use the matching free tool first:

  • message-next-step for deciding how to handle one incoming message: https://tells.voiddo.com/message-next-step/?ref=double-text-risk-related-readme
  • replytone for checking whether your drafted reply sounds warm, clear, or pushy before you send it: https://tells.voiddo.com/replytone/?ref=double-text-risk-related-readme
  • ambiguity-meter for measuring whether the other person's wording is concrete or evasive: https://tells.voiddo.com/ambiguity-meter/?ref=double-text-risk-related-readme
  • ghost-or-go for deciding whether the silence already means "wait", "one final ping", or "stop": https://tells.voiddo.com/ghost-or-go/?ref=double-text-risk-related-readme
  • call-not-text for deciding whether another text is weaker than a channel shift to a call: https://tells.voiddo.com/call-not-text/?ref=double-text-risk-related-readme

Best next free exits

If the user already knows the second-text timing score is not the whole problem, route them to the narrower free checker instead of dropping them into the full catalog:

  • ghost-or-go when the real question is whether silence already means stop, not whether this draft is pushy: https://tells.voiddo.com/ghost-or-go/?ref=double-text-risk-next-free-readme
  • message-next-step when the silence already broke and the real decision is how to handle the incoming reply: https://tells.voiddo.com/message-next-step/?ref=double-text-risk-next-free-readme
  • call-not-text when another ping is weaker than escalating to a call or changing channels: https://tells.voiddo.com/call-not-text/?ref=double-text-risk-next-free-readme
  • replytone when timing is clear and the blocker is whether the draft sounds warm, clear, or too forceful: https://tells.voiddo.com/replytone/?ref=double-text-risk-next-free-readme
  • ambiguity-meter when the draft exists only because the other person's last message was vague or evasive: https://tells.voiddo.com/ambiguity-meter/?ref=double-text-risk-next-free-readme

Programmatic API

import { analyzeDoubleTextRisk, formatReport } from "@v0idd0/double-text-risk";

const result = analyzeDoubleTextRisk("Just checking if you saw this?", {
  hoursSinceLastOutbound: 18,
  followUpCount: 0
});

console.log(result.decision.action);
console.log(formatReport(result));

Development

npm test
node bin/double-text-risk.js --hours 30 "Just checking if you saw this?"

More from the studio

See from-the-studio.md for the wider vøiddo catalogue.

License

MIT.


Built by vøiddo — a small studio shipping AI-flavoured products, free dev tools, Chrome extensions and weird browser games.