Search Ideas
Big week on Veritula 🚀
✍️ A new editor: what you see is what you post.
📰 Long-form articles on your profile. Write one here.
🖼️ Pictures: drop or paste them into the editor; caption them.
💾 Drafts that save as you type and on cmd + s.
🙌 Revisions credit the critics who inspired them.
😎 Profile pictures. Set one here.
@moritz-wallawitsch has already posted his first article:

Comes to iOS Safari
Sadly, as of a recent iOS update, Apple removed the ability to trigger haptic feedback in Webkit browsers.
Should still work on Android, though.
web-haptics: Haptic Feedback Finally Comes to iOS Safari
Photo by Andrew Kliatskyi on Unsplash
lochie just published a package bringing haptic feedback to the web on iOS: web-haptics. I spent four years at Apple working mostly on UIs, so I pay close attention to design and UX. In terms of presentation, use case, and attention to detail, this package comes as close to perfect as I’ve seen.
The problem
On Android, haptics have been available through navigator.vibrate(), but iOS does not support this API. There is a workaround, though – the input element with the switch attribute:
<input type="checkbox" switch>
See this switch input in action here. On iOS, the input renders not as a regular checkbox but as a switch that can be toggled on or off:

Open the link on your iPhone, tap the switch, and you’ll feel haptic feedback. As far as I know, this is currently the only known practical workaround to trigger haptic feedback on the web in iOS.
Implementation
lochie cleverly bases his package on this single workaround and pushes it to its limits. The key lines are here, creating a switch input on the fly:
js (rendered as javascript)const hapticCheckbox = document.createElement("input");hapticCheckbox.type = "checkbox";hapticCheckbox.setAttribute("switch", "");
The package also creates an associated label and clicks it to trigger haptic feedback on the connected input:
js (rendered as javascript)this.hapticLabel.click();
(My understanding is that iOS will not trigger the haptic feedback when the input is programmatically clicked – so the ‘workaround within the workaround’ is to click the associated label instead.)
Custom haptics (!)
But web-haptics can do more than just trigger a single haptic ‘pulse’. The trigger function lets you pass in your own patterns with pulses of different duration and intensity, and even delays.
Want a simple success haptic? Trigger two pulses, as shown on the package homepage:
js (rendered as javascript)trigger([{ duration: 30 },{ delay: 60, duration: 40, intensity: 1 },])
Or simply call trigger('success') as a shortcut.
Here’s an error haptic I made based on Apple’s human interface guidelines:
trigger([{ duration: 40, intensity: 0.7 },{ delay: 40, duration: 40, intensity: 0.7 },{ delay: 40, duration: 40, intensity: 0.9 },{ delay: 40, duration: 50, intensity: 0.6 },])
lochie’s website even gives you an editor to make custom haptics. As you click and drag, both pulses and code update in real time. This experience is developer bliss:

Usage
Importing the package is easy. In Rails, for example:
# config/importmap.rbpin "web-haptics", to: "https://esm.sh/web-haptics@0.0.6"
import { WebHaptics } from 'web-haptics';// In a Stimulus controller somewherelet haptics = new WebHaptics();haptics.trigger('success'); // or 'error', 'warning', etc for built-in hapticshaptics.trigger([{ duration: 40, intensity: 0.7 },{ delay: 40, duration: 40, intensity: 0.7 },])
Pass a debug option to the constructor to hear clicks in development/on desktop:
new WebHaptics({ debug: true });
Again, this package comes as close to perfect as I’ve seen. In fact, I already use it on Veritula: as you type in a text field, an error haptic plays when you exceed the max length (#4473).
I highly recommend web-haptics by lochie.
Preference formation is a computational task. (#5255) To claim we’ve understood a computational task, we must have programmed it (Deutsch). Popper never programmed it, so he didn’t understand it. (To Popper’s credit though, he got pretty technical in defining verisimilitude, logical vs. empirical content, etc.)
Satisfying Deutsch’s yardstick means, in my professional opinion as a software engineer: writing working code to industry standards. It must compile, implement the desired feature with no known bugs, be as performant as the feature reasonably requires, have clean syntax, etc.
Not having programmed preference formation doesn’t show that Popper understood nothing about it.
#5256 doesn’t say Popper understood nothing about it. I think he understood it fairly well, far better than other philosophers, but we now understand it better today than he did.
I understand aspects of how capitalism works
Capitalism isn’t a computational task.
Again I think it depends on the test. I don’t think it’s a fundamental problem for the theoretician, more so for the applied epistemologist. But in general terms, you can just guess that one is more severe, and if nobody has a pending criticism of that guess, you can rationally go ahead with it.
I purposely avoid drinking any water past 8pm so I don’t wake up in the middle of the night having to answer nature’s call. But sometimes that still happens. How can that be?
According to this article, elevating your legs helps with fluid distribution. My understanding is that, as you get older, your body gets worse at fluid distribution. If you’re never horizontal during the day, fluid gathers in your legs. And if bedtime is the first time you’re horizontal, the fluid redistributes as you sleep, some of it gathers in your bladder, and you need to pee.
That explains why I had to use the bathroom in the middle of the night even though I don’t drink anything past 8pm. So I tried elevating my legs the next day, working from the couch for a bit in the evening. It worked! I didn’t wake up having to use the bathroom that night. (I still woke up for some other unidentified reason, but at least I can now rule out this cause.)
They can introduce subjects worth exploring further. Not every useful encounter needs to be exhaustive.
Short videos prevent the depth of explanation that long-form content can provide.
Which conflicting preferences are involved? Why assume stopping expresses the person’s real preference, rather than treating both preferences as ideas to examine?
People sometimes keep watching these feeds while also wanting to stop. That conflicts with the claim that the feed is serving their interests.
True, but serving curiosity is one way to sustain engagement. What separates engagement that serves curiosity from engagement that does not?
Recommendation engines optimize engagement and time spent, not curiosity. Engagement is not always curiosity.
Personalized short-video feeds such as TikTok, Reels and YouTube Shorts are better at serving curiosity than fixed, long-form films. They adapt to your interests instead of fixing a sequence.
I was tired of slow, bloated Spotlight.
Then it hit me: I didn’t have to wait for Apple to fix it. I could just have Claude whip up an alternative.
Meet Blink: results in under 17ms vs. up to 1,083ms for Spotlight. Free and open source.
Download and install:
See demo:

How do we decide which test is more severe? That judgment seems to do the work of forming the preference here. The criticism tree records the judgment, but what explains how we reach it?
The requirement to have ‘programmed it’ is imprecise. Would precise pseudocode count, or must it be executable code? If pseudocode fully specifies the procedure, what additional understanding does translating it into Python require?
This rules out partial understanding. I understand aspects of how capitalism works even though I couldn’t build a faithful simulation of a capitalist economy. Not having programmed preference formation doesn’t show that Popper understood nothing about it. What specific part did he fail to understand?
New on V: a guide that walks you through your rejectable ideas and helps you rehabilitate them.
Check it from time to time to ensure harmony between your thoughts and your actions.
In addition, every rejectable idea on the site now has a ‘Rehabilitate’ link to the same guiding mechanism so you can help other people rehabilitate their ideas.
Try it today: https://veritula.com/guide
New on Veritula: criticized passages get red, overlapping highlights. Comments get gray.
See at a glance which parts of an idea are problematic:

Tags on discussions would solve the same problem with less. A discussion could carry several tags, and nothing would need its own pages, moderators or membership. Subreddits come with all of that.
Idea: communities.
Discussions vary widely, but people gather around topics, like nutrition or software engineering. Communities would group discussions by topic, as subreddits group posts, so people can find the discussions on topics they care about.
Could live at /v/community-name.
There could be a community around nutrition, another for software engineering, a meta community for Veritula, etc.
Ben could have his own community to build his Wikipedia competitor.
“Group or maybe even replace discussions” leaves open two different designs. Grouping adds a level above discussions. Replacing removes them and has to move what hangs off them, like chronicles, the timeline, embedding, and the MCP endpoint’s discussion tools. Until it picks one, it can’t be built.
Moritz Wallawitsch