Alex Gleason 🐍

In 2019 I forked Mastodon. In 2020 I built communities online. In 2021 I helped Donald Trump create Truth Social. In 2023 I built a bridge between Mastodon and Nostr. In 2024 I am building new Nostr infrastructure to spread freedom on the internet and beyond.

I'm vegan btw.


I don't know what Bluesky was thinking when they opted for subdomain @'s instead of email-like names.


I think they would lynch me 😂


Somebody needed to say it.


The question is, do we really accept that as good enough.


I think bluesky _could_ be decentralized IN THEORY. They did design it with that in mind. But nobody has actually done it yet.


I just saw a sign for Pumpkin Spice Real Estate.


In the latest Soapbox, the emojis you use most are automatically shown first in the quick selector.

I also ditched Twemoji and we just render emojis from the OS now.

https://image.nostr.build/344454503e831fed9c4db3d012e0da93feb0aad4a8dbb00112177696f02acec4.png


The hardest part of this is integrating a mini bridge and how that affects interactions across servers. Still haven't solved that from a technical standpoint, leaned into having one bridge.


If I actually do it, I'll ask for your help on the website. Here's what I'm thinking. A dark force enters the sky. The sky turns from blue to purple. For a moment it feels like the whole world is going to end.

https://image.nostr.build/02dc6ec9e030b2eb8edeefccc901b98f5917def78d2313b55c6d097a2495c0b0.jpg


Sooo... it's actually not that hard to get data out of Bluesky. This is 50 lines of code. https://gitlab.com/-/snippets/2540995

https://video.nostr.build/30e37f52426e37f9a890af821badb7bc77c1e6f9a78ce8bb04b8d84cbb45f2e3.webm


This is like the boy version of Taylor Swift on Spotify


Netflix devs panicking rn


I'm not sure there is any truly better alternative. It's just a hard problem to solve.


Unicode soft-deprecated flag emojis due to getting bullied too much about whether Palestine is a country.


Everyone should read this: https://nolanlawson.com/2022/04/08/the-struggle-of-using-native-emoji-on-the-web/


Captcha issue is fixed. To update:

cd /opt/ditto
su ditto
deno task soapbox

Reason: https://gitlab.com/soapbox-pub/soapbox/-/merge_requests/3252


I reproduced it. It does actually succeed, but the UI is messed up and displays an error. If you refresh after solving it works. Will fix this now.


Are you a human? 😂

Jk, I'll check


I found out they do this because of skintone modifiers. But what's more insane... tracking "🫵" and "🫵🏿" both as "index_pointing_at_the_viewer", or tracking them both as "🫵"? At least in the second way reverse lookups are not impossible if you just strip the skintone before lookup. Not to mention the length difference between the two.

nostr:nevent1qvzqqqqqqypzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyral8cdyskghgjf9jz0nmhqjm0h6pscrd0ffayyh6rs4qwslc568ggl8c4k


This fixes it: https://gitlab.com/soapbox-pub/soapbox/-/merge_requests/3251

It should fix the thumbsup scenario too.


Did you run `knox start`?


The emoji situation in this codebase is chaos. I'm thinking about totally rewriting it.

If you see a variable called `emoji`, it _might_ be a string like "😂", or it _might_ be a string like "joy", or it _might_ be an object containing fields with both. Between the extended picker, the quick selector, the Pleroma API, and the settings, it's completely mixed and you have to convert them.

nostr:nevent1qvzqqqqqqypzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyral8cdyskghgjf9jz0nmhqjm0h6pscrd0ffayyh6rs4qwslc568ggl8c4k


I'm having similar problems but I think it's caused mostly by not counting the emojis you click in the quick picker.


Go to /developers/settings_store on your server and you can edit it manually.


Thoughts on this? https://gitlab.com/soapbox-pub/soapbox/-/issues/1786

Are you basing off my recent commits?


Created by Tim Berners-Lee, a British man.


The place with the most opportunities on Earth is not America, it's the Internet.


https://en.wikipedia.org/wiki/Water_fluoridation_by_country

Maybe the root of the problem is that children in America are eating so much sugary crap. Along with this regulation they should put a spear to Kelloggs.


Subkeys or delegation would solve this problem more elegantly, but it would require all clients and relays to change.

I'm currently using nip46. Soapbox is a modified Mastodon client, so I could make it work. But for unmodified Mastodon clients, i have to have the user run a separate program that signs the events alongside the client, so they don't have to expose their key to the server.


People should just brush their teeth.


Elon Musk vs some guy in Japan.

https://image.nostr.build/d5d6627b84426d3f189aad9b294180f9ecfff341d349b4304d39c814134128a8.png
https://image.nostr.build/1c2942398b3b4e8d052c701fc3738dd917fb649db76a279437d73b8cfe2d2315.png


I wish it were that simple. But I have to sign events with their key - ssh doesn't. So it's not just a "tell me who you are" problem, but a "how do I BE you" problem. The only way to accept a password is to custody the user's keys, which I do think defeats the purpose. ActivityPub and Bluesky have keys too (held by the server instead of the user), and this is the one thing about Nostr that makes it matter. That users control their own key.


Man I hate the culture war. Just because you don't like someone doesn't mean you HAVE to disagree with everything they say. I wasn't sure about fluoride in water, so I looked it up, and the **science** says it can cause decreased IQ in children. You really wanna risk that? Also, you know who stopped putting fluoride in water... 98% of Europe.

https://www.reddit.com/r/nottheonion/comments/1grj3v1/winter_haven_commissioners_vote_to_remove/


Am I crazy to think an emoji's canonical identifier should just be a string of itself? Why does it have to be an ascii shortcode? I swear every emoji library is crazy.


Try ditto.pub


I don't think Pleroma FE can work without hacking it since it doesn't support OAuth login to begin with. That's an L on their part IMO. You're right, the bunker stuff is underbaked. I'm still thinking on that. The obvious solution that fixes everything is to just allow username and password login. But it defeats the purpose of Nostr. So I don't know the solution yet. I will keep experimenting. In the meantime we should just make Soapbox work correctly.


I don't think it would be so drastic to be honest, lol.


The Nostr experience is almost immaculate. We have trends, perfect Fediverse integration, and everything works a lot faster and better. It's just a little rough setting up your own server still.


Still a banger. https://www.youtube.com/watch?v=EwTZ2xpQwpA


We don't need to put cows inside of potatoes.


I think a bigger threat we face atm is being so decentralized nobody is even friends.


I found it weirdly deceptive that it makes you "think" you are self hosting this stuff (and it works like magic), and then you have tear so many layers away to reveal the truth.


Btw when you run a PDS, it just just proxies all requests to api.bsky.app. The PDS exposes HTTP endpoints on its own domain, and when you use apps they do hit your domain, but the PDS itself just proxies the requests to the Bluesky centralized server at api.bsky.app.

Your own posts do get saved into a local SQLite database, and there's an endpoint where other servers (like Bluesky's giga relay) can index your posts. It gets away with SQLite because it literally only stores your own posts. Feeds, other people's profiles, etc all get fetched from the upstream in realtime.


Spent a few hours digging through Bluesky's labyrinthian source code. Abstractions on top of abstractions on top of abstractions...

Anyway, they make it impossible to fetch profiles from any PDS or their mega "relay" without credentials. But oddly if you run your own PDS, you can somehow fetch profiles from their central servers without authentication... huh...

So I finally figured out that api.bsky.app is their open domain.

Eg, this one requires authentication:

https://bsky.social/xrpc/app.bsky.actor.getProfile?actor=did%3Aplc%3Azhbjlbmir5dganqhueg7y4i3

But this one does not:

https://api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=did%3Aplc%3Azhbjlbmir5dganqhueg7y4i3

So... they realized they had a problem. In order to be decentralized, you have to allow public access. But instead of just allowing public access to their big mega service, they made a separate service just for PDS installations and then didn't advertise that fact.


"gated community"

It sounds like they want a Discord chat, not a free and open source decentralized social network. You can't be a public square and a gated community. 🤯 Is that really what people think?

For the record my original post is tongue in cheek, I do not think people should be harassed. But they will complain they're being harassed no matter what.


That's called vegetarians.


I tried really hard to use it for Ditto, but it was an epic fail.


I'm running the bridge off it. It's fine, but it gets locked up a little too easily. Thread pool could improve it but at some point you just end up reinventing Postgres.


I've been wondering the same thing. There is none. It's just so they could tick a box.

✅ Decentralized!


Yes, they have a centralized database of accounts. You have to authorize against it to do things like fetch profiles and posts. They're not kidding when they say this isn't even decentralized.


I'm reading up too.

They still require authentication for everything, so I can't make a bridge without using my own account's oauth token.


Should I harass the community of Bluesky by force federating them?


Gorillas are 600 pounds of muscle with a diet of... foliage

https://image.nostr.build/261efe236ac0f5ee0663d02a84825b512e48abdd0c5b9460e1826bedc45c28c5.png


Blasphemous


Good question, need to ask the Vegan Chads https://www.reddit.com/r/veganfitness/comments/uxt5ox/are_steroids_vegan/


Posts from the Fediverse now include imeta tags.


You got it running on a Pi?

I think that's a first. 😃


Yes, as an admin click the 3-dots, then "Moderate User", then "Deactivate Account". It works the same as in Rebased.


Maybe in Amethyst you can configure Ditto as the only read relay, and configure other relays as write-only?


Ahh, I see. If you post through Mastodon API (ie Soapbox) it will rebroadcast your post to all the relays in your relay list. But if you post directly to the relay, it won't do that. The assumption is that if you're using a normal Nostr client you would have multiple relays added. 🤔 But I understand what you're trying to do and why you want to do it.


I think maybe Nostrudel hasn't been updated to the newest nip46 spec, which requires the client to call `get_public_key` rather than trying to infer it from the bunker URI. nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyqnxs90qeyssm73jf3kt5dtnk997ujw6ggy6j3t0jjzw2yrv6sy22nhc2lh


Yeah but this is my fault. I made the post through Ditto and this is my intended behavior, as a workaround for the fact I can't render these posts correctly in Ditto yet.


check: nostr:naddr1qvzqqqr4gupzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqqykkmn00qkkyet5vyhjuvda


Yes and yes. What Nostrability did I break? 😂 If I would just add proper support of longform posts to Ditto I wouldn't need to paste a link at all.


Announcing #Knox: a new Nostr bunker CLI https://habla.news/a/naddr1qvzqqqr4gupzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqqykkmn00qkkyet5vyhjuvda


On Nostr, I am running several marketing accounts for my projects: Ditto, The Mostr Bridge, and Cobrafuma. But I want other people to be able to post from those accounts. In fact, I want to hire a "social media manager" someday (for when my wife is not available 😂).

This is a pretty basic need for social media, but of course on Nostr it isn't basic at all, because private keys have nuclear potential if leaked. Even if you trust the person, a small mistake could be disastrous.

To solve this, we need a bunker.

## What is a bunker?

A bunker (aka "remote signer") allows you to store your keys on your computer, but give others access. Once the other person is granted access, they can send commands to your computer like `sign_event` and `get_public_key`, and your computer will perform those operations without needing to expose the actual key.

![Nostr Bunker](https://image.nostr.build/8b2b28a29502d79a58194cae2edc0d151128a2acbc0d9f8358026d988d771550.png)

In reality the UX is not so technical. Your bunker generates a unique URI containing the connection details, and the other person pastes it into the login screen. Everything else happens automatically.

As for the running the bunker, you can run it on a VPS, a laptop, an old computer in your house, a Raspberry Pi, or even an Android phone.

The first bunker was an Android app called Nostr Connect. This lead to the creation of nsecBunker (a hosted service), nsec.app (a bunker that runs inside your web browser), and Amber (another Android app).

These days nsec.app and Amber are the only ones being actively developed, but due to running in restricted environments (web and Android respectively), they don't offer the level of 24/7 reliability I wanted in a bunker. If you are a single user managing your own keys I still recommend Amber, but for doling out credentials to your team, you might want knox.

## Introducing Knox

![Knox CLI Screenshot](https://image.nostr.build/350617062b88fe891d053739ba40f38c2d8a34f0de099424eb632fce0685fc1a.png)

knox is a command-line tool that manages keys, generates bunker URIs, and runs a bunker server. It is still beta software, but I am using it successfully today to post on Ditto.

knox is inspired by the wonderful [`nak bunker`](https://github.com/fiatjaf/nak) command, which almost solved my problem but has no way to store credentials. So I created my own command-line bunker that you can run again and again.

![knox.bunker thumbnail](https://image.nostr.build/81462ac0a645067b4e546f78d732caa9523d1873641e9519cc877f81d1a36c19.png)

Most notably, knox introduces a portable `.bunker` file format for storing keys and connection details. It's encrypted with a password, which you have to type every time you want to add or remove keys, generate new URIs, and when you start the bunker.

With knox you can have one bunker file, or many. It is loosely inspired by the KeePass `.kbdx` idea.

knox is written in TypeScript, but it's available as a precompiled executable on Linux, MacOS, and Windows thanks to `deno compile`.

## Getting Started

To install knox, I've prepared a simple setup script that will detect your OS and install the knox command in your path:

```sh
curl https://dl.soapbox.pub/install/knox.sh | sh
```

You can also grab a [precompiled binary](https://gitlab.com/soapbox-pub/knox#install) if you don't want to run the script.

## Commands

Once installed, run `knox` to see a list of supported commands. It should look something like this:

```
Usage: knox [options] [command]

Nostr bunker with encrypted storage.

Options:
  -V, --version                    output the version number
  -f, --file <file>                path to the bunker file (default: "knox.bunker")
  -h, --help                       display help for command

Commands:
  init                             initialize a new bunker
  add <name>                       add a new key to the bunker
  remove <name>                    remove a key from the bunker
  uri [options] <name> <relay...>  generate a bunker URI for a key
  revoke <secret>                  revoke an authorization
  pubkey [options] <name>          show the public key of a secret key
  status [name]                    show the status of the bunker
  start                            start the bunker daemon
  change                           change the passphrase of the bunker
  export [options]                 export keys from the bunker
  update [options] [ref]           update knox to the latest version
  help [command]                   display help for command
```

Run `knox init` to create a new bunker file. Then use `knox add alex` (replace with your own name) to add a key, then `knox uri alex` to get a connection string. Finally, run `knox start` to start the bunker.

While the bunker is running, you can continue to run commands like `knox add` and `knox uri` in another tab, and the bunker will detect the file changes and automatically refresh.

![Knox Status command results](https://image.nostr.build/f9753313bb8bca2653cb3fafbc72d1804aae187ae00d467ceeff25e6aaad3f05.png)

Another good one is `knox status`, which shows a list of keys and whether any of their URIs are being utilized. `knox status <key>` can show the individual connections for a specific key, and `knox revoke <secret>` can revoke an individual connection.

## Bunker Where?

knox needs internet connectivity to connect to relays, but it does not need to expose any ports to the outside world, so the ideal place might be on a desktop computer in your living room. This might be considered more secure than a VPS in a datacenter, depending on your circumstances.

![Living room bunker PC](https://image.nostr.build/381aa7a45e675994e6ec4198965d54da72b6f4c42613588297a63c58592a254c.jpg)

I am running knox on an old Dell computer under my TV, which is a cheap and simple solution. It's connected to a backup battery in case the power flickers, but a prolonged outage would require starting the bunker again manually. I also suggest running the bunker in `screen` or a similar tool so you can reconnect and view the logs over ssh on your home network.

It's not suggested to run knox in systemd, because knox requires manually entering the encryption password when it starts. Any solution to store the password to disk, or pass it through a command-line argument, would compromise security.

## What's Next?

For now, knox is meeting my needs. As the idea evolves I expect to make more changes, and possibly improvements to the `.bunker` format if anyone else decides to use it. Feel free to drop any suggestions on [GitLab](https://gitlab.com/soapbox-pub/knox/-/issues)!

Another interesting idea would be to build a UI to manage the `.bunker` file, or to offer hosted bunker (although I am kind of against this, unless the hoster is just cloud sync service and the bunker is decrypted locally within the browser, similar to KeeWeb).

knox is a new Nostr bunker CLI for running a NIP-46 remote signer and granting credentials to members of your team.

This is a long form article, you can read it in https://habla.news/a/naddr1qvzqqqr4gupzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqqykkmn00qkkyet5vyhjuvda


I'm not sure I understand the question. Ditto's relay should work like a normal Nostr relay to other clients, but other clients won't necessarily do things the Ditto way.


Thank you for still thinking that even though you couldn't log in for a month. 😂 Did you fix your computer's clock?


I think the move to "decentralized" alternatives shows that normies do care, but they're too retarded to understand the differences between them yet. Bluesky is comfy for them for now, but held together by the same centralized forces that will inevitably fail. We need to drill people on why portability actually fixes it.


I don't think Nostr is bigger, honestly, but I think the move still needs to happen.

ActivityPub tech is outdated. There are security vulns every 5 minutes. Servers getting hacked and DMs getting leaked.

Meanwhile all the shitlibs are moving off Mastodon to Bluesky like cattle.

Ditto is still a little buggy compared to Rebased, and missing some important features. But it has the most important feature of all: portability. You can sign into any Ditto server with the same key. You can "nuke and remake" your server without issues, or even without losing any posts. On Nostr it's like every user is running their own server for free.

You have one responsibility: don't lose your key. As long as you do that, you have the same level of freedom on Nostr as if you're running your own server on ActivityPub. It also means attackers can't leak the DMs of a whole server at once, they can only target attacks at individual users. So you have control over your own privacy (and responsibility) by keeping your key safe.

It will never be possible to change your username on ActivityPub, but it's baked into the initial design of Nostr. So I am not sure I will ever be able to even "fix" the bridge going the other way, even though from my side it's like I never left.


I am. I just wish I could fix the bridge issues on your side. Look at how much better is looks over here: https://gleasonator.dev/@vic@seal-cafe.mostr.pub/posts/d7d656f3ac7f5f0d73cf4cb55236747a3812d8308e545a068d9bebe8e8c5c296


I tried, believe me. I fought bravely and died.


The Fediverse is unhinged. They are the funniest people online (excluding Mastodon which is the exact opposite). I just wish they wouldn't say the n-word so much.


I love JK Rowling.

https://image.nostr.build/b6c56c330eca6e98854b0bb65154837152ade55f3a9eebcf728b7e69a4cdf574.jpg


This guy's avatar 🤣

nostr:nevent1qvzqqqqqqypzplvf8d4qkrp33l703z2fen8nas47mzskugktm55g69fu2kx58tv0qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyrey8kdfhf2yhhxnjpzkqe7463xhhlsshrphg8jd6k3v6dahn4lqg4jtaqh


Part of the problem (or solution?) is we're a bunch of separate people working on separate projects with average developer salaries. Give me $6M and let me be a dictator and I'll take it to the moon.


😂

https://image.nostr.build/468a60e65de2218e040a90f07664aa417fca33d33d4903f3b6e5fc814318af2a.jpg


- bech32 is used for unambiguity, and an open door to putting ncryptsec in there.
- each new authorization (eg `bunker uri` call) creates a new keypair for security reasons. However you can reuse the same bunker URI "n" number of times by passing an `-n 3` flag for "3 usages", for example. I decided this is actually the behavior I want. So I can say "hey social media manager, can you manage this account?" and then send one URI for all their devices instead of a separate URI for each of their devices.
- in this design, the secret is a uuid, and although it's only used "n" times (1 by default), it's still stored as an ID of the connection, so `knox revoke <secret>` can revoke it.


Have you played with knox? It's still new, but I invented an encrypted .bunker portable file format: https://gitlab.com/soapbox-pub/knox


This thread made me open an issue on GitLab to add "mute conversation" functionality in my new software. https://gitlab.com/soapbox-pub/ditto/-/issues/263


This is hilarious 🤣 https://sonichu.com/cwcki/Kiwi_Farms_silver_coin


CWC coins? Is this a Chris-Chan shitcoin?


I added an extra page to the docs just now on Troubleshooting: https://docs.soapbox.pub/ditto/troubleshooting


Look at the JS console in the browser. It's probably a CSP error, eg your LOCAL_DOMAIN in .env doesn't match the domain of the actual website.


What if I told you I'm both...


I don't know if it would actually happen. But he's definitely thinking about it, lol.


That's rough 😂


I want to fix the Nostr usernames on ActivityPub. How cursed would it be if I check the User-Agent for Mastodon and return a different Actor?


That's genius!


#Mostr Bridge got an upgrade. 👀

Now NIP-05 names on the bridge have a separate subdomain for each ActivityPub server.

For example: alex_at_gleasonator.com@mostr.pub has become alex@gleasonator-com.mostr.pub

This means that from Nostr, each ActivityPub server can be treated separately, for indexing and moderation purposes.

On #Ditto you can now look at a feed each ActivityPub server separately. And they even display a favicon from the upstream server!

Code: https://gitlab.com/soapbox-pub/mostr/-/merge_requests/123

https://image.nostr.build/4546ae411fd524191750c5f71cc08e6d8278c795a00df80f142e60ca63c24dd9.png


Wildcard certs only cover a single level of subdomain. With *.mostr.pub I can get com.mostr.pub, but I would have to acquire a separate *.com.mostr.pub. There are over 1500 TLDs and growing, and that doesn't even cover fedi servers on subdomains like social.example.com.

I still think it's worth doing, but the only practical way is to encode the domain into a single subdomain, eg replacing dots with hypens. But I would need to be careful to handle punycode correctly and prevent spoofing.


Devin Nunes tried to sue a fake cow on Twitter. He failed. He then became the CEO of "free speech" website Truth Social, where he banned the cow from ever mooing again. 🐮 😢


It's okay to put metal in the microwave. Put medieval plate armor in the microwave.


Oh whoops, thank you, fixed.


You gonna get ripped bro


Deno 👍


sanic...


This idea turned out to be wrong, because you can't get an SSL cert that covers subdomains of subdomains. Only way it works is if I replace dots in the domains with underscores or something.

nostr:nevent1qvzqqqqqqypzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqype5hs9p40haeeduru7pdctgle52d5npw9q4g9umk55pytpmts72zwnwcms


The ACLU. Unless you think boys can't be girls and girls can't be boys, then you will die in jail.


VSCodium. I prefer to use common tools.


This is dumb. I gotta write code and tired of arguing, so instead I'm going to send you this list of 65 arguments for why you should go vegan. https://www.godfist.com/vegansidekick/guide.php 😂


Yes, I read it years ago and fully believed it. When I read it again now I think it's bullshit: https://freeross.org/misinformation/

This Curtis Green guy is cucked.

https://www.forbes.com/sites/ryanmac/2013/11/08/meet-the-silk-road-employee-that-the-dread-pirate-roberts-allegedly-tried-to-murder/

Ross tried to kill him and he's backing him up. 🤣 Maybe he's scared?

"On Feb. 16 photos of Green's staged torture were sent to Roberts. Less than a week later a fake photo of Green's supposedly dead body was also delivered to which Ulbricht allegedly replied: "I'm pissed I had to kill him... but what's done is done." On Mar. 1, the second $40,000 installment was sent to the Capital One Bank account."


No I genuinely think Ross is a bad guy, and I feel like I was tricked into believing he's a hero for years until someone argued with me online about it exactly as I'm doing now.


Never do barrel exports. https://dev.to/tassiofront/barrel-files-and-why-you-should-stop-using-them-now-bc4


The thing it has helped me on most is probably SQL. I think it is the world's foremost leading expert on SQL.


I am at the point in my career where I am rewriting huge amounts of JavaScript code by writing scripts that do crazy find-and-replace logic of my source code instead of doing it by hand. Maybe I could be the next Evan You.


This boy SAVED the INTERNET… but couldn't save himself.

10 years ago, he was persecuted by his government, and ultimately paid with his life.

Aaron Swartz is a modern hero that most people DO NOT KNOW.

But they should.

https://image.nostr.build/a5163a2d322330e5853e14ddf87d1613eecbdff0e23451d9f3059d3c1e0cd723.jpg

Aaron was creative, focused, and brilliant.

At 14, he invented RSS; He dropped out of Stanford; At 19, he was in the first Y Combinator class; He co-founded Reddit.

Most likely, if he were alive today, he would be involved with #Bitcoin.

But that’s not EVEN 1% of what he did for us 🙏

Let’s take a look 👇

https://image.nostr.build/37c7dd4a0ddbad0ae5a98babc66adc4916cc4a03b13d63d0fced0e6c3e0541fd.jpg

From a young age, Aaron believed in an OPEN INTERNET. In computers as a tool for LIBERATION.

"But wait, wasn’t the internet always open?"

No.

Believe it or not, there was a time when they wanted you to REGISTER your ID before you could browse or send an email.

https://image.nostr.build/77deabc6b94e160f43a3dd1522c5dac30061ac5423e6b2e3df10162a25e8e612.png

https://image.nostr.build/960a2e8b7b518cd7f34af6d791518cdabf7b7cdc22366decc16c667cad1f727f.jpg

https://image.nostr.build/5d22d57a1ed58ce2f301d45dd09500d066c8c422039ce4c9c30eec586178fddd.jpg

He believed that PUBLIC LEGAL RECORDS and SCIENTIFIC RESEARCH should be accessible to everyone.

But in the U.S.,

• 98% of scientific articles are behind paywalls; and
• ~80% of legal records are too.

Imagine being sued and still having to pay to view the documents?

https://video.nostr.build/2af872c7a7d1b74ce0fb8d42369a87df45a7ee2d23df006d287b58ac60fcfe26.mp4

Aaron's war had 3 major battles.

The first was against PACER.

A legal records database.

PACER is PAID... but it was "free" in 17 public libraries.

With friends, Aaron wrote a script on a USB drive, plugged it into a USB port, downloaded 2.7 million documents... and SET THEM FREE.

https://video.nostr.build/21b565dd1742bc950748be2ac0e0ce2868f4b94c54d1da9321a198c49fe85d1e.mp4

No charges were made against the group.

But the FBI began to take notice.

That had only been the beginning. That boy would still challenge the system.

The following year, Aaron would enter the biggest fight of his life — and the greatest battle in internet history against censorship ✊

https://image.nostr.build/ab43c6a3d189953bfee2fdc26760e819bc9e637dce97d0c8362a36192487b0aa.png

"SOPA/PIPA" 👉 if you're over 20, you probably still remember these acronyms.

A bill to "combat piracy"... which was just an excuse for the government to shut down ANY SITE, without warning.

Some companies loved the idea.

But those who loved the internet fought back.

https://image.nostr.build/605d066f5a7cc73cf8efe620725ac19f3fa9e85b760acd9e66b6f637b6837681.jpg

And then, something wonderful happened.

We still knew how to fight against online censorship.

In a coordinated response, the biggest websites on the internet "went on STRIKE."

Wikipedia and Reddit went offline. Google turned black.

Protests also erupted in the STREETS.

But...

https://image.nostr.build/605d066f5a7cc73cf8efe620725ac19f3fa9e85b760acd9e66b6f637b6837681.jpg

https://image.nostr.build/12adaed7c7a5ce9e8ce3c0944111c45e0e311b02c14319ef31910ea3ee5c60aa.jpg

https://image.nostr.build/7a23543a1a8be95067289d830c766a4af93a321402ba1e2f53b268d660cba2fa.jpg

https://image.nostr.build/0f934d461a5491c39928a1a1bdbfbefe16cb4f70abd6e8bb54c9ee2e6621b438.jpg

... but people have short memories.

This battle was won.

However, the NEXT one would be the LAST for young Aaron.

This MIT security camera was the final straw that ruined his life 👇📹

https://image.nostr.build/e48beb62bce1cdc7554d8e602786a29969a687202f7c7e6971f9f203de3160e6.png

JSTOR was Swartz's final target: the largest database of academic papers in the world.

Aaron wrote a script to download MILLIONS of papers, over the course of months, using his MIT access, in a small room.

MIT has a rebellious culture.

But the FBI could no longer tolerate the boy's defiance.

https://image.nostr.build/0f98f712709cacd788a841186630069f9b8877bbea34374f83c529e0b29d1385.jpg

With the video evidence, the U.S. prosecution charged Aaron with 13 crimes. Up to 50 years in prison.

In January 2011, he was arrested by undercover agents near the Harvard campus.

From then on, he was legally tortured.

Two years later, he would be found dead at home.

https://image.nostr.build/0e6b2b6d4ac93cc031267d6a3ae4fdd1afbaf7154c3d1b28db144e703325eff3.png

https://image.nostr.build/94285f292eb025a91ba591bb14ac0c8739607d428a956f73eb01a7b5c2f1f360.png

"Aaron would be 38 years old today.

He was accused of 'pirating' scientific papers funded with public money.

Facing up to 50 years in prison, he took his own life.

Those he inspired continue to democratize access to science.

Let us remember him."

*These are the words of Susan, his mother.

https://image.nostr.build/cb82dfbd1b0675e53a6a24ba2b6c6c50be08b60dc315f9a3cfbf3de4ded0a191.jpg

After his death, the charges were dropped by the government.

Aaron never considered entering a 'plea deal'. He would have faced millions of dollars in legal costs.

The father of the internet, Tim Berners-Lee, published a short poem at the time that says it all:

“The world was a little worse for his passing,
But a lot better for his being.”

https://image.nostr.build/110bd2ce6b535252ecff250b6609cc6f301b906f6681c2459d375c09af2a9548.png

Aaron wasn’t a unanimous figure. You may disagree with his methods.

But he was faithful to his ideal.

He was genuine. Firm in what he believed.

He was a person who used his prodigious skills not to enrich himself, but to make the internet fairer, and the world a better place.

https://image.nostr.build/570b43a6887dfa430be76e33a416c7bbc65d05e9acf0404ae46ad1a522bf9abc.jpg

Aaron had worked with Virgil Griffith (former Ethereum, now imprisoned for "teaching about crypto" to North Koreans).

He knew Elizabeth Stark (from Lightning).

He was friends with Zooko.

And he wrote about #Bitcoin — on the DAY he was arrested (1/6/11)! 😢

http://www.aaronsw.com/weblog/squarezooko

https://image.nostr.build/5809cf5fa01059fd6333df5a3010a49fbb17642f447d33674ea4388640fb9703.png

https://image.nostr.build/e7fe674ce2598619319edeae7a342da44e8d35baf99aac31df07924c446b8e56.png

https://image.nostr.build/a5ccd76d96ed40ca7a6337050c427d0caee576d1221858aef7e841e32fb9b00c.png

Curious? To learn more about the story, start with this documentary (on YouTube) 👇

[https://youtu.be/9vz06QO3UkQ](https://youtu.be/9vz06QO3UkQ)

We’ll finish with an excerpt from the "Manifesto for Free Access," by Aaron himself:

"Information is power. But, like all power, there are those who want to keep it for themselves. There is no justice in following unjust laws. It’s time to come to the light, and, in the tradition of civil disobedience, declare our opposition to the private theft of public culture.

We must take information, wherever it is, make our copies, and share them with the world."

RIP, Aaron ✊

https://image.nostr.build/18af509a01336df22725822ce2acc3b3008e433dcd83b4c617ad6b877501e34e.png

https://image.nostr.build/a1bf70d3e884b2ff36f35576fc914d42cb71663440d512d89b3c93bc1af5902f.png

https://image.nostr.build/7aa7111a401e98bc3a02ff2ab2321839c79e89f9845bbdaa654f3d468f79b3b0.png


On one hand you have people being falsely charged. On the other hand you have criminals walking free. Neither are justice. But the courts are fucked, so it is common to seek justice in the wrong way.

I understand the nuance. I just think Bitcoin freaks should do a little more critical thinking, something they rarely do, because many of them treat Bitcoin like a religious cult and Ross as a martyr. I got into Bitcoin because it's open source money. It's revolutionary. But I pray to no God, not even the Bitcoin God.


This is not about rape, though. This is about attempted murder. Of six people!


They got him on the wrong charges, yes, but why reverse it? Again it's like Roe v Wade. All you're saying is that it's weak and susceptible to being reversed. But they did it specifically because he deserves it. Right and wrong from a true justice standpoint does not always match what's on the books. The courts are bureaucratic. If an unconvicted rapist got the maximum sentence for a bar fight, I would not fight to reverse it on the principle that the books have to always be right.


For creating Silk Road, I think there should be no punishment at all. For hiring hitmen multiple times and attempting to kill 6 people, I think he should spend life in prison.

> what should be my sentence of saying Alex should be killed? ;)

That's not what happened. What should your sentence be if you paid a hitman $150,000 to kill me but he didn't actually? Look at it from my perspective - this guy being out of jail is a danger to my life. Just because he failed to do it doesn't make it justice.

He hired a hitman for $80K to kill someone. Then he later hired a different hitman for $150K to kill someone. Then he hired the same hitman again for $650K to kill 4 more people. Each time he believed he was doing it. They sent him photos of the body (which detectives recovered... but I guess was fake?)

He sent money the money (to the second guy) to a Bitcoin address, which you can look at and verify. It's included in the transcript.

They are saying the second guy scammed him hard and never actually committed any of the murders. The first guy supposedly also scammed him. But imagine paying someone nearly a million dollars to kill 6 people. This man is a danger to society.

I brought up Aaron Swartz because he is an actual libertarian icon who was falsely prosecuted. Why not choose better heroes? I stand by it that Ross is the George Floyd of Bitcoin bros. Maybe even moreso that they didn't actually commit the murders.


He thought he was killing them, and he kept doing it.


I can accept the idea that the 5 people (actually 6) were not actually murdered. https://arstechnica.com/tech-policy/2015/02/the-hitman-scam-dread-pirate-roberts-bizarre-murder-for-hire-attempts/ Now we are getting closer to the truth. But should Ross be forgiven for trying? This is not like an oopsie whoopsie, had a brain fart haha my bad kind of issue.


I'm open to them being dishonest. But I think they're stupid and lazy, and the only way they faked that transcript was by hiring a creative writer type. And it would be amazing if they kept quiet all this time.


If all he did was run a drug website like I initially believed, then I think he should be free already. It's the murdering 5 people thing I take issue with.


Please run `git pull origin main`, and then try running `deno task setup` again and proceed from there.


Ohhh thank you, let me fix that. One minute.


Okay, tell me more.


I posted 2 articles. You posted nothing.


Same reason Roe v Wade got struck down. They got him on different charges (and gave him life! For a reason) as the easiest path, not realizing how much of a mess it would make later.


So the FBI made all this up about him to frame him, and then investigated it conceded they don't actually have any evidence of it? Makes perfect sense.

Y'all take the position that the extremely detailed and lengthy transcript is made up fan faction by a government worker. I think that's a huge leap, and people are doing way too much twisting into mental knots just so they can feel that Libertarian Man is truly victimized.


How much more reading can I do? I fully believed he was some innocent hacker like Aaron Swartz until I actually started reading. I already read everything. He hired hitmen to kill 5 people. The Bitcoin community is retarded for martyring him. He is like the George Floyd of Bitcoin but 10x worse. Or what, it's a conspiracy? They just made all that up to frame him? Right, the drug guy running the illegal trafficking website would never step into any moral gray areas... the problem is that people don't read.


https://www.wired.com/2015/02/read-transcript-silk-roads-boss-ordering-5-assassinations/

I think that Ross should not be freed. These Free Ross people are crazy.


In March 2013, ELLINGSON, using the Silk Road username “redandwhite,” contacted Ulbricht, Silk Road’s founder, regarding a purported Silk Road user who had threatened to release personal identifying information of Silk Road drug vendors and customers.  In these messages, Ellingson claimed to have control over most drug trafficking in Western Canada.

In one message, Ulbricht informed ELLINGSON that “[the murder target] is a liability and I wouldn't mind if he was executed.”  In another message, Ulbricht stated: “[the murder target] is causing me problems . . . I would like to put a bounty on his head if it’s not too much trouble for you.  What would be an adequate amount to motivate you to find him?”  ELLINGSON responded, “[the p]rice for clean is 300k+ USD,” and the “[p]rice for non-clean is 150-200k USD depending on how you want it done.”  ELLINGSON further explained, in part, that “[t]hese prices pay for 2 professional hitters including their travel expenses and work they put in.”

Ulbricht later sent ELLINGSON $150,000 worth of Bitcoin to pay for the purported murder.  ELLINGSON and Ulbricht agreed on a code to be included with a photograph to prove that the murder had been carried out.  In April 2013, ELLINGSON and Ulbricht exchanged messages reflecting that ELLINGSON had sent Ulbricht photographic proof of the murder.  A thumbnail of a deleted photograph purporting to depict a man lying on a floor in a pool of blood with tape over his mouth was recovered from Ulbricht’s laptop after his arrest.  A piece of paper with the agreed-upon code written on it is shown in the photograph next to the head of the purportedly dead individual.

Later in April 2013, ELLINGSON and Ulbricht exchanged additional messages regarding a plot to kill four additional people in Canada.  Ulbricht sent ELLINGSON an additional $500,000 worth of Bitcoin for the murders.  ELLINGSON claimed to Ulbricht in online messages that the murders had in fact been committed.

Law enforcement does not possess any evidence that the purported murders ELLINGSON claimed to have arranged actually took place.

https://www.justice.gov/usao-sdny/pr/silk-road-drug-vendor-who-claimed-commit-murders-hire-silk-road-founder-ross-ulbricht


These people are truly insufferable.


I understand that ChatGPT makes things harder for people who are retarded. But if you already know stuff it just makes you irrationally angry when it's obviously wrong.

https://media.gleasonator.dev/ipfs/QmVM7rM57vTXk6pVG1kfufVYVxDnHKBMFvDkmxSsv5NVDX


You have to be logged in. Mastodon is a lot of servers, there's no single link you can use. Your account is <pubkey>@mostr.pub


Man that sucks. FireFox doesn't support modern JavaScript. Anyway this fixes it, deployed: https://gitlab.com/soapbox-pub/soapbox/-/merge_requests/3230


What now?


I'm glad the bridge is working again. 🤝


I'm glad I got out when I did. Because I was miserable and I was never going to get those stocks anyway. The Bitcoin boom made up for it a little.


They denied everyone stocks except C-level execs. And they fired half of those too.


How is that possible? Can we do that too?


I missed the Fediverse.


NOOOO, NOT THE GAMERS. WON'T SOMEBODY THINK OF THE GAMERS https://www.levelup.com/en/news/810189/Console-prices-could-skyrocket-by-40-due-to-Donald-Trumps-victory-tariffs-could-make-a-PS5-Pro-cost-up-to-1000-USD-experts-say


TempleOS stuff?


NO. Although you are correct, I want to make the world better, not worse.


You want me to rewrite Soapbox in Rust?


How did we hang on for so long?

https://media.gleasonator.dev/ipfs/QmPk1UaRPMdta147u5jzZQouB7UFfDd3et8QFC3ydw16gu


Oh my god this is so based. Will Soapbox finally be written in modern JavaScript? https://gitlab.com/soapbox-pub/soapbox/-/merge_requests/3216


But btw the most powerful nation in the world is not actually Russia, as they believe, but the Kingdom of Mushroom. The mycelium brain that blankets the whole earth connecting all nations under the kingdom of God.


I was too cowardly to actually go into Russia. But I think it's clear that Putin isn't over WWII. Then again neither is the rest of Europe (and the world?)


I think the best way to make Nostr mainstream would be marketing it as a platform where you, the users, can make money.

If only such a thing truly existed. 😂 But unfortunately: "Your Alby Hub is currently offline"


What I learned is that modern Russia and the USSR are one in the same.


No, like I said I went to the border of Russia.

For the record I'm not a communist anymore, even though a recent article accused me of it. 😂


I stand by it.

nostr:nevent1qvzqqqqqqypzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyrgcle4z4ht0quaqtrpzpt5l0rem5dedexznw00t3wppah2m0tpkcxud24x


It's okay if we were not understood through the internet.


Listen, I went to this place: https://maps.app.goo.gl/NGKC1xaZT7YX7jLf7

How is discriminating against Trump supporters communism. I'm sorry but that's retarded. Can we still be friends? 😂 Trump is buddies with Putin. Putin wants to continue the "communism" of taking control of Ukraine and eventually all of Europe.


What exactly does this have to do with communism?

https://media.gleasonator.dev/ipfs/QmX8rPh3Etgkk9WsbErxadyyQvcj8vZvb1mE1V3LVN82wM


Communism is a fake villain just like Nazism.


whole fucking wikipedia article https://en.wikipedia.org/wiki/Consumption_(economics)

word means "to eat"


Isn't the term "consumer" kind of offensive?


It's automatic: https://mostr.pub/


Mushroom


Sanic the Hadge


GM Nostr and Fediverse.


Finally the bridge is working correctly. #Mostr

https://media.gleasonator.dev/ipfs/QmVYyDScqCLLGt2v37kUd1bL59BHGRxXEfqzWjLCyaev9Y


Brave.


Thinking about subdomains on #Mostr.

For example instead of alex_at_gleasonator.com[@]mostr.pub, I'm thinking alex[@]gleasonator.com.mostr.pub

Why? Because then each Fediverse server can be distinct on the Nostr side using regular nip05 domain filtering.

In the other direction, I'm thinking about doing basically the same thing. I would go ahead and let Mastodon catch on fire over the fact you can't change usernames.


Only nip92 imeta IPFS chads can see this.

https://media.gleasonator.dev/ipfs/QmZLRBV5av687AKhmQenBHt3Jk5A1SN6NtukUbLcfvfNTF


Insanity wolf.

https://image.nostr.build/5ee80941455955da94615863b7370f23ac48c320914cba8539949a1df51321d4.jpg


nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyqlhwrt96wnkf2w9edgr4cfruchvwkv26q6asdhz4qg08pm6w3djgzwr0kg See if you can get it running 👆


👀 https://gitlab.com/soapbox-pub/knox


I think he would have won 2016.


What?


Still in its infancy but not bad: https://gitlab.com/soapbox-pub/knox


It's working...

https://image.nostr.build/2ae5419179bf670a129d7e7d80ffe7564244479f72d21efed419df5fd541913f.png


Hello from #knox!


Guys I am almost finished building a new CLI #bunker for Nostr. It's similar to `nak bunker` except it stores the data long term in a portable encrypted file. As an admin you can run it on any computer and then delegate credentials to your people or to third-party tools. More info soon.


Yes. This is often overlooked. But the number 1 complaint I have always heard on any platform I've managed is "I can't log in".


I think Bernie can still win...


She should have gone on Joe Rogan.


This is the ideal keyboard layout: https://colemak.com/


Update: the populace is split 50/50

https://image.nostr.build/855ee4e52f3c7b3a868e325feac581d1a61feb7814534dec51a229bc84b6e3c2.png


No I can't 😂


"Featured Ad" on Truth Social today, what the fuck lol

https://image.nostr.build/f47089138804f584f706f6b4e2c29289d628a12691591b5bb45330a1c9c3ecde.png


#Voting today.

https://image.nostr.build/a24b9b6bc869dd0f1c7ea417a86c9f9a05454ae02355346fcf58c45a12f76147.jpg


Correct


Lets see if I get banned for this post. https://github.com/mastodon/mastodon/issues/15320

https://image.nostr.build/56f9db7b708d20a1299e87bc15a6fd0299542a71c786a3ae2c8b3073a9863f8b.png


Everybody up in arms about master and slave, but what about kill child and disown child.


Nintendo is too busy suing fans to make a good video game. https://www.ign.com/articles/mario-and-luigi-brothership-review


I am not cutting any corners. Mountain needs to be moved? Alright we move it.


Oops. I just saw your "loved by Jesus" bio. 😂 😂 😂 But honestly this game makes Christianity look so cool. As a Christian you might like it even more.


Blasphemous. Here's what you need to know about it: https://www.youtube.com/watch?v=MhFBOSM3jfI


There are two wolves inside me. One that wants to solve asynchronous file locking so I can build a bunker CLI and then cry into my spaghetti. And another that wants to play videos games and not take a shower. Maybe we can make it work with both.


🤣 👀 https://www.economist.com/1843/2024/11/02/true-believers-built-trumps-social-media-company-they-feel-betrayed


I think it exists on a spectrum, where on one extreme you have enterprise software, designed top-down by stupid managers with everything tacked together, but polished. What I mean is everything is nailed together haphazardly, but they put in so many nails and fine-tune so many adjustments, that it's sturdy anyway. Then they put a facade over it to hide its ugliness. They have analytics, observability (Grafana), monitoring and alerts, etc. But at the end of the day, everything works, and it's taken very seriously if it doesn't.

On the other extreme end you have some crazy evil genius mad scientist guy building strfry on weekends. It's a beautiful fusion of science and art. Do we know how many people use it? No. Do we know what it's doing internally? Not really. Does an alarm go off when it stops working? If anything, having that kind of responsibility would be very off-putting. You can take it or leave it as it is.

I realize I'm just describing open source projects.


The bigger issue is that my design is just not cohesive. The bridge was designed to be an agnostic service, almost entirely in-memory, just transforming things and handing them off in realtime to the other protocol.

But making the strfry relay separate from the bridge itself means I can only control the "output" part of the Nostr flow, and not the "input" part. This is highly limiting in my ability to resolve ActivityPub requests from the Nostr side.

My opinion of strfry is mixed. It's a great feat of engineering but a little unserious.


It was my first ever Nostr project. Which is crazy to think about. I didn't even do a hello world first, I went straight into building an ActivityPub bridge. The thing it needs most is a custom relay built into it, instead of just punting things off to strfry. It's unreliable. And I want to enable really good search functionality and deeper ActivityPub integrations, so that Nostr filters can trigger HTTP requests to ActivityPub content behind the scenes.


I want to completely redesign the Mostr Bridge.


God I love JSR. Good choice.


Me last night

https://video.nostr.build/692f45f83865bbc7d86b0f975d73cb2e3b68aca9242d87f061060f27cc06dcc4.mp4


GM weirdos, Happy November.


Good evening witches and wizards!

I would like to tell you the story of the spookiest bug #Ditto has ever seen. And I'm happy to announce that on this All Hallows Eve, nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyr6aee5wfxntmwh60cg6gtemheducg0qw9f3xawcsmfmh2frn87tknnsjdp and I worked together to make the spectral ghost visible and vanquish it! 👻

The story begins with nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyqeuw3p87wetw0278re7djv3cy322hfqgper2mm3mfy6pcsfld55qyg3pnp (Verita84), who faced this problem so bad he actually left Nostr and went back to the Fediverse.

The problem being: that no matter how hard he tried, he could not log in. He tried other browsers, deleted all data, turned his computer off and back on again. But although it worked perfectly 100% of the time on his other device, it worked 0% of the time on this device.

As the months went on, we received a few complaints here and there from people saying they could NEVER log in to Ditto on a particular device. But our team could never reproduce this problem. So it eluded us. But we would occasionally still hear rare complaints of it.

Well today nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyr6aee5wfxntmwh60cg6gtemheducg0qw9f3xawcsmfmh2frn87tknnsjdp was experiencing the exact same issue. So I added more logs, and he sent screenshots and videos, and we collaborated for several hours. I carefully combed through every line of code in the whole flow, and absolutely nothing was wrong!

Finally I thought to find the NIP-46 event in the Ditto logs, and it occurred to me to check its timestamp. Because there is a 10 second limit on these events, after which the relay would silently reject them.

Strangely, the event's created_at timestamp was actually 12 seconds _before_ the Ditto log timestamp... Hmm...

I assumed he must have a very slow computer, or network connection. But he assured me it was very fast. I raised the limit from 10 seconds to 1 minute anyway. And you know what? IT FUCKING WORKED.

(I also added special treatment for ephemeral events in Ditto, so they would throw an error if they didn't get streamed out, instead of just absorbing it.)

But I told him, since his network was so slow, he would have to wait 12 seconds to log in... But to my surprise, he told me he didn't wait 12 seconds at all. It was instantaneous.

And then it dawned on me. THE CLOCK ON HIS COMPUTER WAS WRONG.

HE TESTED HIS CLOCK, AND IT WAS 12 SECONDS BEHIND!!!!!!!

Date.now() in JavaScript was getting the time from his OS, and his OS had a wrong clock! So the event was getting rejected as being too old.

Holy shit! I couldn't believe it! I still can't believe it! Months of anxiety and terror finally resolved by a fucking clock.

So my friends, remember that this Halloween, the scariest thing is not goblins and ghosts. it's time. Time ages us and destroys us. But it is a reality we have to live with. Let us embrace death! To accept the afterlife is to be free.

Thank you very much my spooky friends and have a Happy Halloween! 👻 🎃 💀

https://gitlab.com/soapbox-pub/ditto/-/merge_requests/576

nostr:nevent1qvzqqqqqqypzpawuu68ynf4ahta8uydy9uamuk7vy8s8z5cnwhvgd5am4y3enl9mqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyrd9rqq9panr7e5nrfk64fwah2k5jamxnm4s9e3z3lm728rnnpdkqkhfae6


Okay, I'll DM you on Fedi


Yep, then maybe we can upgrade to Telegram or Signal from there.


That's the request. I need the response.

Apparently the response didn't get sent through the relay at all. So I'm narrowing down the issue.


Do you still have this open? Could you send the full json of this response event?

https://image.nostr.build/97ca7e53dd37675645e4856237d8765ab40c244529067e6a0efc61bd61620e38.png


Thank you, I can investigate this more now. Be back in 30 mins...


I deployed a custom build of Soapbox with extra logging to gleasonator.dev. Can you please try logging in there?

https://image.nostr.build/f0e05fb63c7f411d7bae20e73c9c17e8cffcc86b954bc6b02b603e85366ebfd5.png


It could somehow be Soapbox or Ditto that's the problem. But it makes no sense that it works perfectly on one machine every time, and never works on the other machine.


It makes no sense to me. Ditto is waiting for your client to respond, but your client already responded. If there was an error, it should have thrown an error in Ditto, but it didn't. I'm going to set up FireFox nightly to see if I can reproduce it there.


I'm going through the code right now and thinking it through


In this screenshot, are your console logs the same as before? The extension is just asking for getPublicKey?


Oh man, that is so odd.


This is really helpful, thank you for your assistance. I need just a little bit more information.

First let me explain what's supposed to happen. Ditto logs you in with the "Remote Signer"  specification. Soapbox implements a Remote Signer. For you to log in, both Soapbox and Ditto must connect to Ditto's relay and send messages to each other.

So, please open the Network tab of your inspector, and filter it by "WS". Then refresh the page.

You should see a request for "relay". Click on that, then click on "Response" in the right sidebar. At first it will be empty.

Now try to log in. Do messages appear in the right pane, like shown here? Or is there even a request to the "relay" at all?

https://image.nostr.build/eec276cc591189747f347eaaa524a9eecd17bcebc9b5ec1e502048f938b7c17b.png


It's Christmas time now.


We benchmarked every known programming language and found that JavaScript is 1.2 million times faster than Rust. The only language faster is Chef.


I couldn't reproduce in FireFox. Maybe tomorrow you can also screenshot the JS console. Here is everything looking fine.

https://image.nostr.build/4282de46608e03707516a5ed4038de466cb68a3b9c6daa454b6f70b5ac0c4760.png


Thank you. I know which part of the code is failing here, but I don't know why yet.


Also can you check if the same problem occurs on another Ditto instance? ditto.pub gleasonator.dev cobrafuma.com


There is definitely something wrong. But I'm not sure what yet. https://grafana.soapbox.pub/dashboard/snapshot/iqYQUQANVMBjuI6iRcWH3GxdLFI4Uhvs


Let's fix this. I'll video call to get to the bottom of it if we have to. This issue has disturbed me ever since, but I cannot reproduce it.


Can you please send a screenshot or a video?


This is horrifying. I won't be able to work anymore once they DMCA all the music I listen to on YouTube. https://www.youtube.com/watch?v=DQ5EeImWYaI


Holy shit! https://github.com/airbnb/lottie-web/issues/3127


The Nostr secret key hardcoded into `nak bunker` is the profile a blind FOSS developer. https://the-brannons.com/

nostr:nevent1qvzqqqqqqypzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyz538a8r4etyeylh2cn8ty6q8pjlqu84cf8qs7zh7ppka6weqez5vlq5cde


This is #nak

nak bunker wss://gleasonator.dev/relay


See if you can figure out why the first one Bunker login failed but the second one succeeded. Actually, don't. It's because when I copied the Bunker URI, I accidentally copied the "b" from the start of the next line.

https://image.nostr.build/8bcd2172ed01cfcfc2c971d47ec02d7a66f33cc80c0817fccbd9fa8b04f0611f.png


Is it okay to think of the Bible as part of the Harry Potter Universe?

nostr:nevent1qvzqqqqqqypzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyq9cukwmf8qegascdczgf7u3xpnng7rz6xp0gyvx3gwg0vzns30ayq5lwuj


If you want to be perfect, go, sell your possessions and give to the poor, and you will have treasure in heaven.


hello


Yes, absolutely... isn't that obvious? Who do we need to flush their head in the toilet?


No, it was vulnerable 6 commits ago.


Oh my God the Fediverse is the biggest drama center on the planet. https://roiskinda.cool/2023/12/recuerda-pv-chapter-7-the-dark-and-ugly.html


It's a modular class now that you can call anywhere in random places and then dispose of it. Eg:

https://image.nostr.build/eeec5203e83c4811e41130df2e9302e808a0d119b403e9a6529bea63c1de8d26.png


I completely rewrote the bunker ine Soapbox. I'm amazed that it's working.


This is actually a valid URI.


c:


GM! I have been building a new remote signer and bunker. So I decided to make some diagrams about NIP-46.

I think it's important to think about the RPC layer as separate from the Nostr Connect layer. This makes everything make so much more sense, and if you separate the two parts in your code the code is going to be more maintainable.

https://image.nostr.build/c1801003703601fb33aac09b315345be70b659e3913ee266b4c6580032528498.png
https://image.nostr.build/2306874504d9b08353d79b808109abe0ae944513dedb98a8aac7e14a3e985678.png


Blasphemous is the greatest game ever.


You would use relay hints inside of events to discover new relays automatically. Then you connect to those and keep downloading and crawling. Similar to how Google crawlers use links to find the whole web. Primal's Nostr crawler does this.


I think you can. Is Bitcoin decentralized? Yet everyone's balance is known. If everybody crawls and downloads the whole network, it can be decentralized and have accurate counts.


I have taken a very unusual and extreme approach, but I think it's a good one: do not allow users to export their private key. If they generate a key through my client, I show it to them exactly once, and then don't allow them to access it again.

I have even taken it a step further, and prevent _scripts_ from being able to access the key in localStorage after the page has loaded.

nostr:nevent1qvzqqqqqqypzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyze0remyxj4we2n2jwsjzpwalpem7287apkvjpktxa4pdr42lcxdydl6nx5

(See: https://gitlab.com/soapbox-pub/weblock/-/blob/main/src/StoragesLock.ts )

However, I don't have any red text that says "Do not use this, it's insecure". My wife says this is a "Dead dove do not eat" moment: https://www.youtube.com/watch?v=YUKmq7UMJys

In my case I am actually expecting users to paste private keys as an acceptable part of the flow. So I had to take all these precautions.

If you want to let people export their key, then keep the red warning text, don't lock the storage, and then only access the storage directly when people are on that specific part of the UI where they need to export their key.


You're right.


https://gitlab.com/soapbox-pub/nostrify/-/blob/main/packages/nostrify/NSecSigner.ts?ref_type=heads

It's missing a conversation key cache. `#secretKey` prevents property access.


Mr Staab is an important part of the Nostr community, and Coracle has paved the way for important stuff like groups, custom feeds, and... Remote Signing. I think this is more indicative of the pitfalls with Nostr itself than Jon's coding abilities, especially with the big red text saying "This is insecure" on Coracle's private key option.


My advice is have a module that reads the keys from storage and turns the keys into Signer objects when the app starts, then never directly access the keys in your code. Make the Signer object compatible with NIP-07 so you can use it interchangeably.


Almost captures it, but misses the double takes and hallucinations.


I have decided to stop ignoring this urge and been pulling all nighters whenever it strikes.

https://image.nostr.build/b85fbbc1252ba7272a070fbf8f1333ac118a36eeb3d3cb894338ec1ce3044eca.jpg


People come to America for a better life then eat at Chili's in the most uncultured and uninspired place imaginable.

https://image.nostr.build/fe2eb62108e793933d2a7c706ae5abb487802d15eaab8daa4e65f29b717fb008.jpg


Crikey...

https://image.nostr.build/4a128a82ef91d81d85bee9798dd0351d74506ac515cffd0b729731f4701f60f1.jpg


Grateful this precious part of the Internet continues to exist this #Halloween. http://ravensblight.com/


We can draw the image in ASCII art...


I don't think it's possible to put inline graphics in an OS notification.


In the docs, click "Edit this page" at the bottom and submit a pull request please. Thank you!


We went into the woods and collected sticks and my father created this Eldritch horror. #Halloween

https://image.nostr.build/582867de895897db8eccd78e7f238f9e30ca3e3e92dc4bb5c54f9a5b4ee29ffb.jpg


This is not a political post. I already regret writing this post. Isn't it interesting they call Trump "Hitler 2.0" yet he supports Israel, but that's actually worse? I am not making any point or political statement with this post. Do not reply to this post.


I think you are missing the point here.

Please watch this 1 minute video: https://www.youtube.com/watch?v=IeTybKL1pM4

And after that watch this 1 minute video created by the same person: https://www.youtube.com/watch?v=PW-pPUYcroQ


The only thing wrong with plagiarism is pretending you made it yourself. Copy and give credit.


Copying is not theft.
Stealing a thing leaves one less left
Copying it makes one thing more;
that’s what copying’s for.

Copying is not theft.
If I copy yours you have it too
One for me and one for you
That’s what copies can do.

If I steal your bicycle
you have to take the bus,
but if I just copy it
there’s one for each of us!

Making more of a thing,
that is what we call “copying”
Sharing ideas with everyone
That’s why copying
is
FUN!


Acho que as pessoas não se sentem mais seguras no X. A oportunidade ainda existe.


There is probably some way for an attacker to get around this. But I made a best effort to modify the global JavaScript API in the browser to prevent access to specific items in localStorage.

Basically as soon as possible into the page loading, we get the value and make it a private property of a NostrSigner object (so you can only call methods like getPublicKey, signEvent, etc), then we lock the key from being accessed again. An XSS attack would have to load prior to this script getting called, or do some JS trickery I haven't considered.

https://image.nostr.build/25e0f56b16af6af73bd91f0dfb327b298c08345bf8f797e055e38a79634de8dc.png


Filho da puta de um filho bastardo.


Sad, but some have still not embraced the gospel of d.


NOOOOOOOO


Pro-tip: add unique index on (pubkey, kind) where kind >= 10000 and kind < 20000 or (kind in (0, 3))

Use ON CONFLICT clause on insert: https://gitlab.com/soapbox-pub/nostrify/-/blob/main/packages/db/NPostgres.ts?ref_type=heads#L176

10x performance of replaceable event lookups AND insertions while guaranteeing correctness.

(Addressable events get the same treatment if you copy the d tag to a column and index it for the kind ranges too)


Step 1 🤔
Step 2 👌
Step 3 🤌
Step 4 🫡


nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyrtp7w79k045gq80mtnpdxjuzl9t7vjxk52rv80f888y5xsd5mh55rw6kru is this true? Have you ever touched a grain of rice in your life?


Portuguese sanity, Serbian insanity. #rice

https://image.nostr.build/cdaf86b06eb8d347f0c0e5ddf25f2aa07efa8245d6e89260495ffd3fc9a9ea83.jpg


I have a team meeting today where we are going to create a little flow chart about how to make Nostr #win.


That is a sick outfit.


Oh boy oh boy oh boy oh boy gm


I have the same feeling. nak is a testing tool. Might make more sense to rip the bunker functionality out of it and make a dedicated CLI.


Okay now that this is finally working it's amazing. nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyp6hjpmdntls5n8aa7n7ypzlyjrv0ewch33ml3452wtjx0smhl93jwr7nvv


Hello from #Ditto with #Amber!


Ahhh I just got it to work!

I have been using Direct Connection, but for some reason the "Amber is running in the background" notification didn't show up until like 10 minutes later. After I started seeing that it started to work.


Ideally you can add and remove multiple named keys. You can list keys. You can generate multiple bunker URIs for each key, and limit access to each with NIP-01 filters. Authorizations can be reviewed and revoked.

It would probably have new subcommands like `nak bunker add <name> <nsec>`, `nak bunker list`, `nak bunker uri <name>`, `nak bunker authorizations <name>`, `nak bunker revoke <id?>`.

All should accept a flag to the database file, but should default to a fixed filename in the current directory.

A JSON file would be fine. Ideally it could be encrypted with a password, but don't know how to overcome challenges with running it in systemd (especially with auto-restart) that way.

I am also not sure what happens to the regular `nak bunker` without any subcommand. It can continue to work like it does, or be removed in favor of subcommands.


I need to create a new Nostr bunker from scratch.

`nak bunker` is very close to being a usable solution, except it doesn't have a database so it is a manual process and cannot be unattended.

nostr:nevent1qvzqqqqqqypzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyrrhxyp6feudfgjwlnwtfn4zlt30qgs0nejcrgwkr3awh34jvq7756rneu4


nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyp6hjpmdntls5n8aa7n7ypzlyjrv0ewch33ml3452wtjx0smhl93jwr7nvv Are you able to log into Ditto with Amber? https://ditto.pub/login/nostr

When I try, Ditto sends the request on the relay but receives no response from Amber. Amber does not seem to receive any event.

Currently Ditto requires that its own relay is used ( wss://ditto.pub/relay ) and it requires the use of a secret. I created an app in Amber, configured it to use the Ditto relay, and enabled a secret, but when I paste the Bunker URI there is no activity on the Amber side.


I thought about it. Then I realized this is valid when setting CSS values in JS.


Seems legit.

https://image.nostr.build/531a50fb51532a54a63eef9c1a95375f84d52eca4f910610aff46528fdd5e064.jpg


Language filtering is standard in NIP-50.

As for "daniele gossip", we only index the display name and nip05 for kind 0 events, because indexing the bio would return wrong results and we didn't figure out a good way to weight the fields.


We need a version of nsecbunker that actually works. Then it will fix that. Have you tried Amber? https://github.com/greenart7c3/Amber Now I want to try harder to get it working correctly with Ditto.


Time to repost this banger.

nostr:nevent1qvzqqqqqqypzq7wzets3f63g4xq7w4vmflnc2jj8x5s63532v6a6h8azfr4cyrlkqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyzl5jyfndyn3xmy4pa2dz0ymuy8epzlajd8wmyalsxk4vlrzw8phzn8zq7r


It does do nip46 for that behind the scenes. I just never added this UI to let people do it directly until now. 😃


It's half of the solution to this problem:

nostr:nevent1qvzqqqqqqypzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyrrhxyp6feudfgjwlnwtfn4zlt30qgs0nejcrgwkr3awh34jvq7756rneu4


https://ditto.pub/login/nostr

https://image.nostr.build/b7f7dc1705f10dd2d438ac2661c5d68fa0ebdc24a988798de7f768ec7739c44e.png


#Ditto servers now have a SECRET NIP-46 bunker login page, accessed by navigating directly to /nostr/login on the server: https://gitlab.com/soapbox-pub/soapbox/-/merge_requests/3172

(It's only "secret" because I need it for R&D, but haven't taken the time to properly work it into the design of the login flow.)


A great feeling when coding, is not just when you add a new feature, but when you do something that unlocks new possibilities. One piece of code can open doors that makes so many other things possible, your mind starts racing.


NIP-46 URL parsing drama in JavaScript runtimes: https://github.com/denoland/deno/issues/26440


I need to create a system on Nostr where I can give other people limited access to some keys so they can post from marketing accounts. I'm thinking there are two ways to do it. One is to start a nak bunker on a Raspberry Pi or something and hand out a NIP-46 connection string. Other way is to put a small web service where my people can submit a "to post as" event from their own pubkey, include a "rumor" in it then have the service publish their "rumor".


For being right


You are such an angry little shit head.


Elon is winning. ☹


Chimpanzee on Instagram.

Remember, you never know who's in your replies.

https://video.nostr.build/3f29f04d60195bf8566b5235eeab6f8bb16bd4553f3e28b389acb4225cde06df.mp4


🐮

https://video.nostr.build/0ce0d4beb676022bc502d3261d1385123f9256ea6629871fe50ae302193ff728.mp4


Lol https://www.propublica.org/article/trump-media-whistleblower-complaint-devin-nunes


Woke up with that pounding headache again. I found out it happens not after a late night of drinking, but after making 5+ pull requests in a day.


Whoever said "life imitates art more than art imitates life" is fucking wrong. There are over 400,000 species of beetles.


If you go into the "Discover" tab of #Ditto, you can now infinitely scroll the top Nostr posts of all time through history!

nostr:nevent1qvzqqqqqqypzq3e9jpmvshujgr59yssdwgfujh54zqh3m6fflds0xw3vxftsexxyqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyq9rnf6khkzjcu20q7w69gl2pe7y08440ktd4esaluwf7245la53z4xkhuk


🤦♂ https://github.com/formatjs/formatjs/discussions/4604


You think it's pure hatred? I think people only get that mad because of intrusive thoughts. Things they could imagine about themselves. (This is risky but I'm still sending, forgive me)


I bet he neatly folded it and stashed it in his closet.


A little old man on a nature trail said guudu moning to me and I hit him back with ohayo gozaimasu and it was very wholesome.


It's Hamtaro time.


This is an interesting slider captcha. It's 100% noise.

https://image.nostr.build/b2099c5676001dc98ba97cc5a9c447206b4e261b3a44bc854b083633d22d8b61.png


Only on Brave would you have to solve a captcha to SEE ads. 😂

https://image.nostr.build/278c616ef2368df453bdf0103d088bd02c75d003e7c2c8137f84982231091935.png


Fix: https://gitlab.com/soapbox-pub/ditto/-/merge_requests/553/diffs


Lol yes. Here is the "algorithm":

1. If the Ditto server admin has manually marked any users as "suggested", they will appear at the top, in the order they were marked.

2. Globally "Trending" accounts are appended to this list.

3. Finally, anyone you already follow, mute, or have dismissed as a suggestion is removed.

There's no personalization at all. It would be a good thing to add. Mastodon does it by suggesting accounts you've interacted with but haven't muted or followed, weighing your interactions like: reposts 3, likes 2, and replies 1.

As for the global "Trending Accounts" algorithm, that's done by counting "p" tags in kind 1, 3, 6, and 7 events across the Ditto relay. Due to the way follow lists work on Nostr, this ultimately causes kind 3 to rule the algorithm, and what you get is just top followed accounts of all time rather than recently relevant accounts. BUT, when I tried removing kind 3 from the calculation it prioritized controversial accounts, which is arguably worse.

We are doing a lot with limited resources, using only TypeScript and Postgres, so Ditto remains easy to develop and easy for people to self-host. Something like Redis would make this task easier, but we don't do it. So we need to devise clever solutions to these problems, and turn "good enough" into "gooder enough".


They say developers are an oversaturated profession. But the developers are retarded.


nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyzfjv9zhrt7t44x30gv3ac5puw0whw6phyl6er7c0q5ky2htzyh56wq0pzz 🤣


if jb55 is so good, why not jb56? nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyqewrqnkx4zsaweutf739s0cu7et29zrntqs5elw70vlm8zudr3y2sndk4n

https://image.nostr.build/97981d79465e7c73e91aadb803ad15639682bb1da20e8a2a4d6213956c78c201.png


On mobile, too.


If you allow browser notifications you will continue to get notifications even after you close the tab.

https://image.nostr.build/f280ee24ee8df8039d5af033aa20c67cda6aca2e2bdb883bfd3462955cf80ea9.png


The people behind Deno are working hard. They want to win badly.


Web Push Notifications have been implemented on #Ditto! 👍


These are the same people banning me from groups on the Fediverse. I tell you the worms are in their brains because of the election.


That's what I'm thinking, lmao.


But do they all call GET /Catherine/api when the page loads? https://github.com/search?q=%2FCatherine%2Fapi&type=code


They have one. They just aren't utilizing him.


Truth Social's new streaming website looks exactly like this Slovenian telecom provider's service. Huh! Interesting.

https://image.nostr.build/81cb2d1729708df5a44f28ee75840bcf07ef4140b90c18a2048dcbe545fc0f45.png
https://image.nostr.build/ca7eccbc960c5a4a01e60cdb87d8231d918f9912a9cd564e1890e4eea2c90bec.png


There was a study where people took turn ratings songs on a fake music review website, 1-5 stars. Each person could see the reviews from the people before them. Justin Bieber is widely disliked, but the study found that if the first participant rated the music highly, like 5 stars, it would continue to be rated more highly be other participants. If they rated him low, he would stay low.

The moral of the story is that an initial group of people can set the stage and perception of a thing, in the beginning. Right now it's Bitcoin. But Bitcoin isn't even that bad! Honestly it's one of the best online communities out there.

We need a few more nice communities like Bitcoin before we attract a mainstream audience.


Did you just stylize Nostr! with an exclamation point?

nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyppm4tcv9rnvlvv4k9lwpqlpn6e6ft7l432dnd4679czwrk3j035ctjv2wn get on this ^


GM 🥱


I like terse branch names, so while working on Web Push Notifications I named the branch "push". This creates a weird flow in git where you're tying stuff like "git pull origin push" and git push origin push"

https://image.nostr.build/ba979281d3cf38bdba236298aacf2f1dd6ab2af19c68669108b09528005d8769.png


This is a job for nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyqrx8x3cdjwpq9ppwc3ve085pyyvfudqcvlz87xk668540m9t78hz2yu954


I opened: https://gitlab.com/soapbox-pub/ditto/-/issues/246


In what browser?


Dude Copilot is a game changer. I can't believe it. It's like it reads my mind and knows exactly what I want to type. I can't emphasize enough how big of a game changer it is. I can do probably 20% more per day with it. So no, I think it's great. I'm assuming whoever wrote this article was testing it against a trash codebase. I don't like Microsoft Corporation controlling my text editor, and I'm against the fact it's proprietary software. But it's one of those things where if you're not using it, you're getting left behind. So no, couldn't disagree more.


Just received this crazy political meme pamphlet to my mailbox. 😂

https://image.nostr.build/779c911a21accda92352c1167d4d1368d35f6e02d3ac6d86b097dd20ff88ccd9.jpg


Easier said than done 😂


Thank you for your support! 😁 ✊


A big challenge of client performance is that you cannot optimize filters. There are a few objective things you can do, but without knowing the relay's query planner you don't know if it's better to make one request or two requests, for example. How you structure the filter could result in completely different performance on different relays. None are perfectly optimized for all shapes of filters. Extending filters to do more things might exacerbate this issue rather than help it. Regardless, this is an inherent limitation with doing JIT querying of relays. You are basically deciding that you prefer the freedom and purity of the protocol over UX. And that's fine.


Now Ditto ships with a megabyte of stock photos in its source code, lol. https://gitlab.com/soapbox-pub/ditto/-/tree/main/src/assets/captcha/bg


Still recovering from ReplyGuy one month later, #Ditto has a puzzle captcha now.

We coded this captcha from scratch using the Canvas API, mainly based on work by nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyqzhg5md8m6dvha0jk6z8ymppwz8t530fs55vjw5d3gdt5m0w5n8cx8mcz8 and implemented in Soapbox by nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyr8fwdnuwhtaj8aehsaudl6mkw7m2tqcjsdlechndpskmjls4h7j78f4j4t 😃

https://image.nostr.build/7d6839d6e038479f7accb097932068784da7fe16014ef7b6779c6ad6a8841b97.jpg


This tool is pointless. It's a run of the mill code formatter with no configuration.


"don't use eslint for formatting, linters are for linting formatters are for formatting, use prettier"

prettier: "Prettier is not a kitchen-sink code formatter" "Option requests aren’t accepted anymore" "Please note that as option requests are out of scope for Prettier, they will be closed without discussion."

https://prettier.io/docs/en/option-philosophy


That type annotations thing is needed badly. I was just thinking about it.


How dare you put a .js file in a TypeScript project


Tired of being stuck in 2017 with Axios and xhr. I want new things to be based on Fetch API. A lot of code depends on it so I want to change it now. Couldn't get past this in the "best" existing library: https://github.com/sindresorhus/ky/pull/606 Wasn't worth forking it when I need only a fraction of the functionality anyway. So I wrote this instead: https://gitlab.com/soapbox-pub/soapbox/-/blob/main/src/api/MastodonClient.ts?ref_type=heads Honestly not bad, but it took way longer to figure out than it looks.


I wrote an http client library from scratch at 4am


What the fuck? That sounds nice. Feels like I'm constantly pushing the limits of what's possible. It's honesty surprising how much isn't solved.

https://image.nostr.build/2fbe8a67599f2bebc13d34eebf3d8a95638168121925d56a0f30f5d2afcc8315.jpg


Yes this is what NIP-48 is for. Posts created by the bridge have ["proxy", remote-url] tags, and the bridge ignores any incoming posts that have them.


Oh it's better than that. It's only the best academic institution in the Greatest Nation on Earth. 🇰🇵

https://image.nostr.build/b37bb8b6117dd252c0501f858c9e55a80baf99132ab70ad9c1318069d28cc441.png


This is what a Peak Performance LinkedIn profile looks like.

https://image.nostr.build/c860282b9a7e135274980747df61c1def041302e2253a5eb276332e1d725fc1e.png
https://image.nostr.build/ce82d3042983ff55df189a52dbf1ab31a7cf15b90934e301ae3abd2abb10a826.png
https://image.nostr.build/d87d5b32f4f6622b35b45aca8bc88b2d6be7b9f449f0a1d7cbdfc526459a1138.png


Damn

https://image.nostr.build/e028fa9951f0a9d1ea3f38068601bce9f578ce22e573e8462f283a7042939912.jpg


I like this idea.


You tell me: https://gitlab.com/soapbox-pub/nostrify/-/blob/main/packages/policies/WoTPolicy.ts?ref_type=heads


The way my Web of Trust policy works, is that it's actually a simple whitelist policy. A whitelist policy is given a set of pubkeys and only allows events by those authors. The only difference is that the WoT policy generates the pubkeys first before passing them in.

But that's an async operation. You only want it to happen once. But JavaScript constructors are synchronous. Anyways, I'm out of time.


Let me tell you what I learned about JavaScript today, that I wish I didn't have to. If you create a rejected promise, and you put it in a variable, and you don't catch the promise in the same tick, it results in an "unhandled promise rejection" that crashes your entire application. Also, if it's not an "Error" instance that rejects (but rather a different type of primitive or object), you don't even get a stack trace. You get an error like this:

error: Uncaught (in promise) null

With absolutely no other information. Your application is crashed and you have no idea how to fix it. And you'd better pray you logged the right stuff above it to use context clues to figure it out.

Anyway, here is the problem code (left) and the fixed solution (right).

https://image.nostr.build/b3f01ac78bbc7b0663f671571df079e65ac2538a34539d723ea5c0d0138c941c.png
https://image.nostr.build/145b01c72531ed614ea8ac298c10c9527635b6668defa6c76e4aaed706e5fad8.png


Oh I feel the urgency.


Machine translations, coming soon to #Ditto 👀 nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyprjtyrkep0eys8g2fpq6usne90f2yp0rh5jn7mq7vazcvjhpjvvgldfpkw

https://video.nostr.build/42ba5d61a604bfbb0dbd6916b440e71b08b64cbeed31300c4b097da59e98f5ec.mp4


Would you accept Hitler's pull request?


Que porra você acabou de dizer sobre mim, sua putinha? Quero que você saiba que me formei como o melhor da minha turma no Navy Seals, e estive envolvido em vários ataques secretos à Al-Qaeda, e tenho mais de 300 mortes confirmadas. Sou treinado em guerra de gorilas e sou o melhor atirador de elite de todas as forças armadas dos EUA. Você não é nada para mim, mas apenas mais um alvo. Vou acabar com você com uma precisão nunca vista antes na Terra, marque minhas palavras. Você acha que pode se safar dizendo essa merda para mim pela Internet? Pense de novo, filho da puta. Enquanto falamos, estou entrando em contato com minha rede secreta de espiões nos EUA e seu IP está sendo rastreado agora, então é melhor você se preparar para a tempestade, verme. A tempestade que destrói a coisinha patética que você chama de vida. Você está morto, garoto. Posso estar em qualquer lugar, a qualquer hora, e posso te matar de mais de setecentas maneiras, e isso é só com minhas próprias mãos. Não só sou extensivamente treinado em combate desarmado, mas tenho acesso a todo o arsenal do Corpo de Fuzileiros Navais dos Estados Unidos e vou usá-lo em toda a sua extensão para limpar sua bunda miserável da face do continente, seu merdinha. Se você soubesse que retribuição profana seu pequeno comentário "inteligente" estava prestes a trazer sobre você, talvez você tivesse segurado sua língua. Mas você não podia, você não fez, e agora você está pagando o preço, seu idiota maldito. Vou cagar fúria em você e você vai se afogar nela. Você está morto, garoto.


Olá mundo


First one I actually believe.


Deno 2's launch video is awesome! 😂  They had to outdo Bun, and they did. https://youtu.be/d35SlRgVxT8


People running #Ditto servers, if you pull from main you also need to upgrade Deno, because 2.0 has a few breaking changes. You also can't upgrade Deno without pulling from main.

nostr:nevent1qvzqqqqqqypzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyzrmwvn7c2esas6q5dpd0rvsdqq6q5p24emkdv80hhrxxhglum6rcv9el9u


#Ditto upgraded to Deno 2.0! 🎉 https://deno.com/blog/v2.0


They really don't like that I circumvented Facebook's block of it. Which tells me all that I need to know, lol. https://soapbox.pub/blog/threads-server-blocking/


Nah we just weren't married or engaged but she was more than my gf. Although this lead to some interesting copypastas. 😂 https://www.reddit.com/r/Pleroma_Mastodon/comments/z62td3/in_defense_of_rebasedsoapbox_alex_gleason/


It's actually kind of cringe because I was still in between perspectives then so it has more virtue signaling than I would write today. But the general idea, I still basically agree with.


Transgender Exclusive Radical Feminist. It's a rabbit hole. The tl;dr is that a long time ago I wrote this blog post, which I still think is pretty reasonable and nuanced but challenges a mainstream leftist perspective, and they're still mad about it. https://archive.ph/vgTBH


I really touched a nerve with these people. They're writing walls of text about what they think of me. But it's not really about me, it's about their perception of what they want me to be so they can virtue signal over it. This is crazy.


This is what they're saying about me 🤣

https://image.nostr.build/7d64fc2e81fa907e329201907d6f11c5a60fe8151a5bd36604aa6ac854d8a4a1.jpg


It's the "official" activitypub developer forum where people who don't code anything write extremely long posts and argue about things they'll never do. https://socialhub.activitypub.rocks/


Yeah I would have an account at the very least. I think it's important to not give in to bullies.


They are saying if they allow this it will become a "Nazi bar" (someone literally said this) https://en.wiktionary.org/wiki/Nazi_bar

nostr:nevent1qvzqqqqqqypzqprpljlvcnpnw3pejvkkhrc3y6wvmd7vjuad0fg2ud3dky66gaxaqydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyzlxu4quxlrjwpndv64hdwtrgeez0vcqw77znwfe9l8v82q9yqtsgn37qdv


My best guess is they're a little on edge due to the US election and fighting a proxy battle against Donald Trump.


Here is an example post of something I posted in May. Now suddenly they're after me, seeking to cancel and remove me from every angle. But they have no real power!

https://image.nostr.build/ebf97a93b164cad1d3224528a1632cf94bd8bc7b1add5e0c879ba3660ddee7fe.png
https://image.nostr.build/30c2c31d113d3447ff148c9a87b15bf74af8ccb652408d742fdf105ffde730bd.png


Continuing to get cancelled on the #Fediverse. lmao what the hell is going on??

https://image.nostr.build/d45ed1841c747a3887294d2a6b56f866e8867942a7ea26b9c284cdd6caa77ae1.png


👀 https://github.com/denoland/deno/releases/tag/v2.0.0


Machine translations are coming soon to #Ditto 👀

https://image.nostr.build/43755a6c5c2f7f6d742729bbbc49fffc44925fd090782ba1b30e949a0a33750b.png


I think your best bet for now is probably to use Vite in a Node project (instead of Deno), and use Nostrify like this:

npx jsr add @nostrify/nostrify

It may be possible to get it working with Deno with Deno 2's release candidate, but I don't know how exactly to set up Vite with it.

https://image.nostr.build/9272cbe9be667ed5861a46cc9c6299f7146ceaeb3f3bba7b7fc53c4cc1a5a5b0.png


Here it is with nostr-wasm:

https://image.nostr.build/0188bde5fad8f4b4f8961719262c7f3a4a422dbcdccc913e6b5eb2bed1c47aac.png


nostr-wasm speeds up signEvent performance considerably, but encrypt/decrypt has no equivalent.


Nostr Signer benchmark using nostr-tools.

https://image.nostr.build/00264665ce1519cb5d401e06e2a259e693b7066a015c99e994bf5954a3d7e21f.png


And then the Rust stuff is getting compiled to wasm.


I'm learning a lot about cryptography. Just enough to be incompetent.


Ditto is a continuation of my work on Spinster and Truth Social, so there's already precedent of it not being used like that.

There's a whole other side of the Fediverse: https://fediverse.wiki/wiki/The_Great_Wall_of_Mastodon


I didn't post a single comment in that room as this was happening, lol. One guy said the Mastodon community only cares about white trans people but not black people, then left. Some guy was talking about "sealioning" and "Nazi bars", another guy was criticizing me but complimenting my software. One transgender individual was critical of me but ultimately said I shouldn't even be banned from the chat. I guess this moderator guy decided to just kamikaze the whole chat because one person didn't like it.


GM, clownworld update:

https://image.nostr.build/00582f5d8b01243bbbe1a2a0b39e604bbc9bc2d1141c936e3f173cd3e9d6c5eb.png


Want to make a dubstep track, electronic synth buildup, abrupt silence then "OK Google" in a female robotic voice. Everyone's phones beep as the beat drops, then a hypeman yells some unhinged search query.


What the hell? https://grugbrain.dev/


Never mind: https://github.com/negrel/webpush


There is no modern Web Push JS library that uses the Web Crypto API and has tests.


It's Web 3.0 if only by incrementing the number in Web 2.0.


I think they have lots of tools they use to thinly veil their obsession with Hitler, such as "The Paradox of Tolerance"


If you ask a woke person to explain their point of view, eventually it will always come back to Hitler. Some people have role models they aspire to, such as George Washington, MLK, Gandhi, or Jesus Christ. A woke person's goal is to discredit these role models, because their own own ultimate role model is Adolf Hitler, a negative role model, in the sense that they want to be as much NOT like him as possible, rather than aspiring to BE like an aspirational figure. This negative mindset leads to division, counterproductivity, and self demise. These people who call themselves atheists ironically align themselves most with fundamentalist religious nuts who obsess so much with fighting the Devil they forgot how to love God. Regardless of your beliefs, the best thing for one's mental health is to focus on your own aspirations, to seek inspiration, and to NOT try to obsessively control people because of perceived wrongs of the past. And then maybe someday we will be able to move past WWII.


#Ditto language filtering!

Over 100 language are supported, with infinite scrolling.

https://video.nostr.build/639589ade227e87ba21997bb95097261094c75dcc06ecdf85ff90f1a5f993a14.mp4


In a way, we're seeing the biggest creative renaissance ever with "content creators", but the TikTok clips just ain't Bill Watterson.


My dog's schedule: Wake up. Puke. Cry. Go outside. Cry some more. Lay on the couch looking pathetic. Get scared from the bug zapper (not very vegan). Go to box. Sleep. Repeat.


*West, fuck


The East of the US actually is a lot like Western Europe. The East of the US is kind of its own thing. The point is that the terms are switched even though the directions are correct.


I've flown over both oceans now, and this is a stupid thought but, to the East is the West of Europe, and to the West is the East of Asia.


Nah we still don't support streaming for it yet, but at least it doesn't push English posts into the feed.


nostr:nprofile1qy2hwumn8ghj7erfw36x7tnsw43z7un9d3shjqpqvxd0dfst8ljvwva2egrpc53ve8ru78v8aaxfpravchkexmfmmu3s5r7065 the bugs you mentioned with it are fixed.


I haven't participated in Fediverse anything in months. I moved to Nostr and been minding my own business. They won't let it go.


Thanks to work by nostr:nprofile1qy2hwumn8ghj7erfw36x7tnsw43z7un9d3shjqpqgujeqakgt7fyp6zjggxhyy7ft623qtcaay5lkc8n8gkry4cvnrzqep59se and nostr:nprofile1qy2hwumn8ghj7erfw36x7tnsw43z7un9d3shjqpqe6tnvlr46lv3lwdu80r07kanhk6jcxy5r07w9umgv9kuhu9dl5hsz44l8s , it's now possible to filter the global feed by language on #Ditto!

This helps people to more easily find posts in their native language. Portuguese, for example. 🇧🇷

https://image.nostr.build/74a35e550b979d545c08c424d9554e327e2984716949d4fc546357c976b94318.png
https://image.nostr.build/714ba94a3e0bafae8fec07a92ddcd841a3950ee0d6b8ed7fcc9f67df4770614c.png
https://image.nostr.build/55de071ad4710145d3082a58e466bbeaf9de5195fc9f3bad03a58179747efebb.png


Thank you for sticking up for me in there!


Vegan Hitler strikes again.


I said there is 2 genders like five years ago and they're still mad about it.


GM.

https://image.nostr.build/17dcc5fdc18f31cfa2e3c477ff0535fb4409b8eb2f8c82498c4775ee6e3e765b.jpg


To bake bread from scratch first you have to invent the universe.


A web server is just software.


A relay is just a web server.


I love this book.

https://image.nostr.build/77ea33377517ad3c8a69f62aac8b86c64133f72322a9d1057aad30f4911d8617.jpg


You should read Persepolis though, if you haven't.

https://image.nostr.build/a5c275dc7750d2a1e9da33d6008028af4cae4862b3c85b472a8ce190522fe067.png


No I don't think we should bomb my grandfather in Iran. I was just sharing an interesting fact. I don't think I had a bigger point to it.


I don't know why it's so hard for normal people to identify insects just by looking at them.


For a long time I mistakenly thought that daddy long-legs were "technically not spiders", just because people mistakenly call crane flies "daddy long-legs", and crane flies are definitely not spiders.


Iran stones gays to death, yet subsidizes gender transition surgeries.

Source: am Iranian.

Fact check: TRUE.


Outbox, like Nostr itself, depends on relays having high performance if you want to query events in response to a user action. But relays aren't reliable or fast. It's faster if the client just has the events already before you even look at it.


They serve views with this instead of querying relays directly: https://github.com/PrimalHQ/primal-caching-service

Then they got bullied hard for that and added the ability for users to choose their relays. But I'm still not sure if the clients actually connect directly to those relays, or just add it as an extra parameter to their service. Either way i think their idea was valid all along.


For a pure client, outbox is good, it's a big improvement. But what servers can do is completely different. Outbox can tell you where something is located so you can try to get it JIT. That doesn't mean it won't be slow or even work at all. Servers can try all day long to get it, even while you're phone is powered off. All it needs is a moment in the day where the relay is working, so it's available for you instantly when you go online.


What I'm saying is there's 2 types of clients: pure clients and hybrids.

Pure clients implement Nostr perfectly. Users have total sovereignty. Being totally sovereign comes at a cost. Users have to make decisions about what relays to use, and bear some responsibility for their own UX based on the choices they make. They also have to commit to storing all that data locally, using up bandwidth and battery life, etc.

Hybrid clients rely on some server operated by the developer of the app to serve the data. This means they control the UX. But this way it can always be fast, because there is some middleman who is always online, always collecting and processing data to serve it to you instantly. The downside is they can censor. But as long as you control your key, you can move to a different client. Therefore, the most important aspect of Nostr is that users control their key, and both types of clients need to exist to create a healthy ecosystem.


I disagree that's what's holding speed back. The issue is that clients talk directly to relays "just in time", and relays themselves are slow because they're getting overloaded by malfunctioning clients and don't have the right protections.

Pure clients can partially solve this by reading from an internal database synchronously and populate it asynchronously (like Damus does with nostr-db), but there's limits to smartphones being able to do that without wasting precious disk space, battery life, bandwidth, etc.

Which is why I think the server model used by Ditto and Primal wins for mass adoption. Pure clients need to exist for freedom reasons, but it's a choice people need to want to make.


I want to go look undre the ground in Settle, Washingtont


The guy wants to loop through the whole database to count polls.


It's on the roadmap, but I must admit we're still focused on the most absolute basic features of a social network so we can support mass adoption.


Brazil is stuck in Brazil's 1988 or in America's 1988?


Deep-fried memes. The reason I bring this up is because I need to deep-fry a #captcha

https://image.nostr.build/717ce7289623a539ad0be01b25e8d4f964082b0da3aba19e270c8d7a10e435b8.jpg
https://image.nostr.build/2292fdf4a81151a4d2d0bc2f4451ecb95424d5ba8cea8a9ca1dba20bcd3c5d27.jpg
https://image.nostr.build/36123f42df747a0d0b81f95fb6227f277538221e6d63d2747642c462ca2a4f48.png
https://image.nostr.build/e7b3d6bf591449b3222b38aa7d4a7b5373055be6ab3a7d8f0a6ef853f6a35396.jpg


Does anyone feel like we're still stuck in 2019?


That is quite awesome! We've been talking about graph databases a lot. nostr:nprofile1qydhwumn8ghj7emvv4shxmmwv96x7u3wv3jhvtmjv4kxz7gqyqzhg5md8m6dvha0jk6z8ymppwz8t530fs55vjw5d3gdt5m0w5n8cx8mcz8 needs to see this.


I think this is possibly the most cursed place that exists on the planet? https://maps.app.goo.gl/PeV9cNH777MGXYA56


Based on what I can figure out, the benefit of this may just be consistency at higher levels of difficulty? Like, on average the required time scales linearly with the difficulty, but the range of different possible times is broader the higher you go. So solving many easier challenges takes the same amount of time as solving one equivalent challenge _on average_, but the one difficult one is more likely to take a lot more or less time than the average.


I'm not, but I'd love to see it.


Clients can also parallelize to solve a single PoW challenge. I guess starting 2 workers on the same problem could make it take half as long? (I'm not sure about that.)

I wonder what the implication is for spammers, to have to solve many small challenges instead of one big challenge. 🤔


Proton Mail requires proof-of-work with their captcha. But it's not just one - the client has to solve 32 PoW challenges.

This is interesting because this work can run in parallel. The difficulty is only 13, so each one should take less than a second to solve in theory. I'm still thinking it through.

https://image.nostr.build/4b73b17f599ef203b746628b4d558759a5e2fb522d8b43acaa1dfa67717fe39b.png


I once jumped on the stage at Nathan's Hot Dog Eating Festival in Coney Island, New York, and my colleague dumped fake blood all over Joey Chestnut's hot dogs. Some outlet reported it was "ketchup", so I emailed a corrected. They updated the article to say "fake blood", then a few hours later edited it back to say "ketchup" again.


Usually the headline is "technically correct" but leaves out vital  details on purpose.


Most of the "Fake News" today is actually a clickbait headline with body text that seems to contradict it if you actually read it. This is because "journalist" and "headline writer" are actually two separate jobs.


"Is mostr working?"

Well, I can answer that question with a graph. The answer is "somewhat": https://grafana.soapbox.pub/dashboard/snapshot/WIZmJTyoRx2YAZ1Our9oVFcNN4t1uefx


All it takes for Nostr to get big is one thing to get big. I'm razor focused on that mission. Just hang on a little longer.


Yep.