-

@ 04c915da:3dfbecc9
2025-03-10 23:31:30
Bitcoin has always been rooted in freedom and resistance to authority. I get that many of you are conflicted about the US Government stacking but by design we cannot stop anyone from using bitcoin. Many have asked me for my thoughts on the matter, so let’s rip it.
**Concern**
One of the most glaring issues with the strategic bitcoin reserve is its foundation, built on stolen bitcoin. For those of us who value private property this is an obvious betrayal of our core principles. Rather than proof of work, the bitcoin that seeds this reserve has been taken by force. The US Government should return the bitcoin stolen from Bitfinex and the Silk Road.
Usually stolen bitcoin for the reserve creates a perverse incentive. If governments see a bitcoin as a valuable asset, they will ramp up efforts to confiscate more bitcoin. The precedent is a major concern, and I stand strongly against it, but it should be also noted that governments were already seizing coin before the reserve so this is not really a change in policy.
Ideally all seized bitcoin should be burned, by law. This would align incentives properly and make it less likely for the government to actively increase coin seizures. Due to the truly scarce properties of bitcoin, all burned bitcoin helps existing holders through increased purchasing power regardless. This change would be unlikely but those of us in policy circles should push for it regardless. It would be best case scenario for American bitcoiners and would create a strong foundation for the next century of American leadership.
**Optimism**
The entire point of bitcoin is that we can spend or save it without permission. That said, it is a massive benefit to not have one of the strongest governments in human history actively trying to ruin our lives.
Since the beginning, bitcoiners have faced horrible regulatory trends. KYC, surveillance, and legal cases have made using bitcoin and building bitcoin businesses incredibly difficult. It is incredibly important to note that over the past year that trend has reversed for the first time in a decade. A strategic bitcoin reserve is a key driver of this shift. By holding bitcoin, the strongest government in the world has signaled that it is not just a fringe technology but rather truly valuable, legitimate, and worth stacking.
This alignment of incentives changes everything. The US Government stacking proves bitcoin’s worth. The resulting purchasing power appreciation helps all of us who are holding coin and as bitcoin succeeds our government receives direct benefit. A beautiful positive feedback loop.
**Realism**
We are trending in the right direction. A strategic bitcoin reserve is a sign that the state sees bitcoin as an asset worth embracing rather than destroying. That said, there is a lot of work left to be done. We cannot be lulled into complacency, the time to push forward is now, and we cannot take our foot off the gas. We have a seat at the table for the first time ever. Let's make it worth it.
We must protect the right to free usage of bitcoin and other digital technologies. Freedom in the digital age must be taken and defended, through both technical and political avenues. Multiple privacy focused developers are facing long jail sentences for building tools that protect our freedom. These cases are not just legal battles. They are attacks on the soul of bitcoin. We need to rally behind them, fight for their freedom, and ensure the ethos of bitcoin survives this new era of government interest. The strategic reserve is a step in the right direction, but it is up to us to hold the line and shape the future.
-

@ 4857600b:30b502f4
2025-03-10 12:09:35
At this point, we should be arresting, not firing, any FBI employee who delays, destroys, or withholds information on the Epstein case. There is ZERO explanation I will accept for redacting anything for “national security” reasons. A lot of Trump supporters are losing patience with Pam Bondi. I will give her the benefit of the doubt for now since the corruption within the whole security/intelligence apparatus of our country runs deep. However, let’s not forget that probably Trump’s biggest mistakes in his first term involved picking weak and easily corruptible (or blackmailable) officials. It seemed every month a formerly-loyal person did a complete 180 degree turn and did everything they could to screw him over, regardless of the betrayal’s effect on the country or whatever principles that person claimed to have. I think he’s fixed his screening process, but since we’re talking about the FBI, we know they have the power to dig up any dirt or blackmail material available, or just make it up. In the Epstein case, it’s probably better to go after Bondi than give up a treasure trove of blackmail material against the long list of members on his client list.
-

@ 6389be64:ef439d32
2025-02-27 21:32:12
GA, plebs. The latest episode of Bitcoin And is out, and, as always, the chicanery is running rampant. Let’s break down the biggest topics I covered, and if you want the full, unfiltered rant, make sure to listen to the episode linked below.
## House Democrats’ MEME Act: A Bad Joke?
House Democrats are proposing a bill to ban presidential meme coins, clearly aimed at Trump’s and Melania’s ill-advised token launches. While grifters launching meme coins is bad, this bill is just as ridiculous. If this legislation moves forward, expect a retaliatory strike exposing how politicians like Pelosi and Warren mysteriously amassed their fortunes. Will it pass? Doubtful. But it’s another sign of the government’s obsession with regulating everything except itself.
## Senate Banking’s First Digital Asset Hearing: The Real Target Is You
Cynthia Lummis chaired the first digital asset hearing, and—surprise!—it was all about control. The discussion centered on stablecoins, AML, and KYC regulations, with witnesses suggesting Orwellian measures like freezing stablecoin transactions unless pre-approved by authorities. What was barely mentioned? Bitcoin. They want full oversight of stablecoins, which is really about controlling financial freedom. Expect more nonsense targeting self-custody wallets under the guise of stopping “bad actors.”
## Bank of America and PayPal Want In on Stablecoins
Bank of America’s CEO openly stated they’ll launch a stablecoin as soon as regulation allows. Meanwhile, PayPal’s CEO paid for a hat using Bitcoin—not their own stablecoin, Pi USD. Why wouldn’t he use his own product? Maybe he knows stablecoins aren’t what they’re hyped up to be. Either way, the legacy financial system is gearing up to flood the market with stablecoins, not because they love crypto, but because it’s a tool to extend U.S. dollar dominance.
## MetaPlanet Buys the Dip
Japan’s MetaPlanet issued $13.4M in bonds to buy more Bitcoin, proving once again that institutions see the writing on the wall. Unlike U.S. regulators who obsess over stablecoins, some companies are actually stacking sats.
## UK Expands Crypto Seizure Powers
Across the pond, the UK government is pushing legislation to make it easier to seize and destroy crypto linked to criminal activity. While they frame it as going after the bad guys, it’s another move toward centralized control and financial surveillance.
## Bitcoin Tools & Tech: Arc, SatoChip, and Nunchuk
Some bullish Bitcoin developments: ARC v0.5 is making Bitcoin’s second layer more efficient, SatoChip now supports Taproot and Nostr, and Nunchuk launched a group wallet with chat, making multisig collaboration easier.
## The Bottom Line
The state is coming for financial privacy and control, and stablecoins are their weapon of choice. Bitcoiners need to stay focused, keep their coins in self-custody, and build out parallel systems. Expect more regulatory attacks, but don’t let them distract you—just keep stacking and transacting in ways they can’t control.
**🎧 Listen to the full episode here: [https://fountain.fm/episode/PYITCo18AJnsEkKLz2Ks](Fountain.fm)**
**💰 Support the show by boosting sats on Podcasting 2.0!** and I will see you on the other side.
-

@ 6e0ea5d6:0327f353
2025-02-21 18:15:52
"Malcolm Forbes recounts that a lady, wearing a faded cotton dress, and her husband, dressed in an old handmade suit, stepped off a train in Boston, USA, and timidly made their way to the office of the president of Harvard University. They had come from Palo Alto, California, and had not scheduled an appointment. The secretary, at a glance, thought that those two, looking like country bumpkins, had no business at Harvard.
— We want to speak with the president — the man said in a low voice.
— He will be busy all day — the secretary replied curtly.
— We will wait.
The secretary ignored them for hours, hoping the couple would finally give up and leave. But they stayed there, and the secretary, somewhat frustrated, decided to bother the president, although she hated doing that.
— If you speak with them for just a few minutes, maybe they will decide to go away — she said.
The president sighed in irritation but agreed. Someone of his importance did not have time to meet people like that, but he hated faded dresses and tattered suits in his office. With a stern face, he went to the couple.
— We had a son who studied at Harvard for a year — the woman said. — He loved Harvard and was very happy here, but a year ago he died in an accident, and we would like to erect a monument in his honor somewhere on campus.
— My lady — said the president rudely —, we cannot erect a statue for every person who studied at Harvard and died; if we did, this place would look like a cemetery.
— Oh, no — the lady quickly replied. — We do not want to erect a statue. We would like to donate a building to Harvard.
The president looked at the woman's faded dress and her husband's old suit and exclaimed:
— A building! Do you have even the faintest idea of how much a building costs? We have more than seven and a half million dollars' worth of buildings here at Harvard.
The lady was silent for a moment, then said to her husband:
— If that’s all it costs to found a university, why don’t we have our own?
The husband agreed.
The couple, Leland Stanford, stood up and left, leaving the president confused. Traveling back to Palo Alto, California, they established there Stanford University, the second-largest in the world, in honor of their son, a former Harvard student."
Text extracted from: "Mileumlivros - Stories that Teach Values."
Thank you for reading, my friend!
If this message helped you in any way,
consider leaving your glass “🥃” as a token of appreciation.
A toast to our family!
-

@ 94a6a78a:0ddf320e
2025-02-19 21:10:15
Nostr is a revolutionary protocol that enables **decentralized, censorship-resistant communication**. Unlike traditional social networks controlled by corporations, Nostr operates without central servers or gatekeepers. This openness makes it incredibly powerful—but also means its success depends entirely on **users, developers, and relay operators**.
If you believe in **free speech, decentralization, and an open internet**, there are many ways to support and strengthen the Nostr ecosystem. Whether you're a casual user, a developer, or someone looking to contribute financially, **every effort helps build a more robust network**.
Here’s how you can get involved and make a difference.
---
## **1️⃣ Use Nostr Daily**
The simplest and most effective way to contribute to Nostr is by **using it regularly**. The more active users, the stronger and more valuable the network becomes.
✅ **Post, comment, and zap** (send micro-payments via Bitcoin’s Lightning Network) to keep conversations flowing.\
✅ **Engage with new users** and help them understand how Nostr works.\
✅ **Try different Nostr clients** like Damus, Amethyst, Snort, or Primal and provide feedback to improve the experience.
Your activity **keeps the network alive** and helps encourage more developers and relay operators to invest in the ecosystem.
---
## **2️⃣ Run Your Own Nostr Relay**
Relays are the **backbone of Nostr**, responsible for distributing messages across the network. The more **independent relays exist**, the stronger and more censorship-resistant Nostr becomes.
✅ **Set up your own relay** to help decentralize the network further.\
✅ **Experiment with relay configurations** and different performance optimizations.\
✅ **Offer public or private relay services** to users looking for high-quality infrastructure.
If you're not technical, you can still **support relay operators** by **subscribing to a paid relay** or donating to open-source relay projects.
---
## **3️⃣ Support Paid Relays & Infrastructure**
Free relays have helped Nostr grow, but they **struggle with spam, slow speeds, and sustainability issues**. **Paid relays** help fund **better infrastructure, faster message delivery, and a more reliable experience**.
✅ **Subscribe to a paid relay** to help keep it running.\
✅ **Use premium services** like media hosting (e.g., Azzamo Blossom) to decentralize content storage.\
✅ **Donate to relay operators** who invest in long-term infrastructure.
By funding **Nostr’s decentralized backbone**, you help ensure its **longevity and reliability**.
---
## **4️⃣ Zap Developers, Creators & Builders**
Many people contribute to Nostr **without direct financial compensation**—developers who build clients, relay operators, educators, and content creators. **You can support them with zaps!** ⚡
✅ **Find developers working on Nostr projects** and send them a zap.\
✅ **Support content creators and educators** who spread awareness about Nostr.\
✅ **Encourage builders** by donating to open-source projects.
Micro-payments via the **Lightning Network** make it easy to directly **support the people who make Nostr better**.
---
## **5️⃣ Develop New Nostr Apps & Tools**
If you're a developer, you can **build on Nostr’s open protocol** to create new apps, bots, or tools. Nostr is **permissionless**, meaning anyone can develop for it.
✅ **Create new Nostr clients** with unique features and user experiences.\
✅ **Build bots or automation tools** that improve engagement and usability.\
✅ **Experiment with decentralized identity, authentication, and encryption** to make Nostr even stronger.
With **no corporate gatekeepers**, your projects can help shape the future of decentralized social media.
---
## **6️⃣ Promote & Educate Others About Nostr**
Adoption grows when **more people understand and use Nostr**. You can help by **spreading awareness** and creating educational content.
✅ **Write blogs, guides, and tutorials** explaining how to use Nostr.\
✅ **Make videos or social media posts** introducing new users to the protocol.\
✅ **Host discussions, Twitter Spaces, or workshops** to onboard more people.
The more people **understand and trust Nostr**, the stronger the ecosystem becomes.
---
## **7️⃣ Support Open-Source Nostr Projects**
Many Nostr tools and clients are **built by volunteers**, and open-source projects thrive on **community support**.
✅ **Contribute code** to existing Nostr projects on GitHub.\
✅ **Report bugs and suggest features** to improve Nostr clients.\
✅ **Donate to developers** who keep Nostr free and open for everyone.
If you're not a developer, you can still **help with testing, translations, and documentation** to make projects more accessible.
---
## **🚀 Every Contribution Strengthens Nostr**
Whether you:
✔️ **Post and engage daily**\
✔️ **Zap creators and developers**\
✔️ **Run or support relays**\
✔️ **Build new apps and tools**\
✔️ **Educate and onboard new users**
**Every action helps make Nostr more resilient, decentralized, and unstoppable.**
Nostr isn’t just another social network—it’s **a movement toward a free and open internet**. If you believe in **digital freedom, privacy, and decentralization**, now is the time to get involved.
-

@ 9e69e420:d12360c2
2025-02-17 17:12:01
President Trump has intensified immigration enforcement, likening it to a wartime effort. Despite pouring resources into the U.S. Immigration and Customs Enforcement (ICE), arrest numbers are declining and falling short of goals. ICE fell from about 800 daily arrests in late January to fewer than 600 in early February.
Critics argue the administration is merely showcasing efforts with ineffectiveness, while Trump seeks billions more in funding to support his deportation agenda. Increased involvement from various federal agencies is intended to assist ICE, but many lack specific immigration training.
Challenges persist, as fewer immigrants are available for quick deportation due to a decline in illegal crossings. Local sheriffs are also pressured by rising demands to accommodate immigrants, which may strain resources further.
-

@ fd208ee8:0fd927c1
2025-02-15 07:02:08
E-cash are coupons or tokens for Bitcoin, or Bitcoin debt notes that the mint issues. The e-cash states, essentially, "IoU 2900 sats".
They're redeemable for Bitcoin on Lightning (hard money), and therefore can be used as cash (softer money), so long as the mint has a good reputation. That means that they're less fungible than Lightning because the e-cash from one mint can be more or less valuable than the e-cash from another. If a mint is buggy, offline, or disappears, then the e-cash is unreedemable.
It also means that e-cash is more anonymous than Lightning, and that the sender and receiver's wallets don't need to be online, to transact. Nutzaps now add the possibility of parking transactions one level farther out, on a relay. The same relays that cannot keep npub profiles and follow lists consistent will now do monetary transactions.
What we then have is
* a **transaction on a relay** that triggers
* a **transaction on a mint** that triggers
* a **transaction on Lightning** that triggers
* a **transaction on Bitcoin**.
Which means that every relay that stores the nuts is part of a wildcat banking system. Which is fine, but relay operators should consider whether they wish to carry the associated risks and liabilities. They should also be aware that they should implement the appropriate features in their relay, such as expiration tags (nuts rot after 2 weeks), and to make sure that only expired nuts are deleted.
There will be plenty of specialized relays for this, so don't feel pressured to join in, and research the topic carefully, for yourself.
https://github.com/nostr-protocol/nips/blob/master/60.md
-

@ 0fa80bd3:ea7325de
2025-02-14 23:24:37
#intro
The Russian state made me a Bitcoiner. In 1991, it devalued my grandmother's hard-earned savings. She worked tirelessly in the kitchen of a dining car on the Moscow–Warsaw route. Everything she had saved for my sister and me to attend university vanished overnight. This story is similar to what many experienced, including Wences Casares. The pain and injustice of that time became my first lessons about the fragility of systems and the value of genuine, incorruptible assets, forever changing my perception of money and my trust in government promises.
In 2014, I was living in Moscow, running a trading business, and frequently traveling to China. One day, I learned about the Cypriot banking crisis and the possibility of moving money through some strange thing called Bitcoin. At the time, I didn’t give it much thought. Returning to the idea six months later, as a business-oriented geek, I eagerly began studying the topic and soon dove into it seriously.
I spent half a year reading articles on a local online journal, BitNovosti, actively participating in discussions, and eventually joined the editorial team as a translator. That’s how I learned about whitepapers, decentralization, mining, cryptographic keys, and colored coins. About Satoshi Nakamoto, Silk Road, Mt. Gox, and BitcoinTalk. Over time, I befriended the journal’s owner and, leveraging my management experience, later became an editor. I was drawn to the crypto-anarchist stance and commitment to decentralization principles. We wrote about the economic, historical, and social preconditions for Bitcoin’s emergence, and it was during this time that I fully embraced the idea.
It got to the point where I sold my apartment and, during the market's downturn, bought 50 bitcoins, just after the peak price of $1,200 per coin. That marked the beginning of my first crypto winter. As an editor, I organized workflows, managed translators, developed a YouTube channel, and attended conferences in Russia and Ukraine. That’s how I learned about Wences Casares and even wrote a piece about him. I also met Mikhail Chobanyan (Ukrainian exchange Kuna), Alexander Ivanov (Waves project), Konstantin Lomashuk (Lido project), and, of course, Vitalik Buterin. It was a time of complete immersion, 24/7, and boundless hope.
After moving to the United States, I expected the industry to grow rapidly, attended events, but the introduction of BitLicense froze the industry for eight years. By 2017, it became clear that the industry was shifting toward gambling and creating tokens for the sake of tokens. I dismissed this idea as unsustainable. Then came a new crypto spring with the hype around beautiful NFTs – CryptoPunks and apes.
I made another attempt – we worked on a series called Digital Nomad Country Club, aimed at creating a global project. The proceeds from selling images were intended to fund the development of business tools for people worldwide. However, internal disagreements within the team prevented us from completing the project.
With Trump’s arrival in 2025, hope was reignited. I decided that it was time to create a project that society desperately needed. As someone passionate about history, I understood that destroying what exists was not the solution, but leaving everything as it was also felt unacceptable. You can’t destroy the system, as the fiery crypto-anarchist voices claimed.
With an analytical mindset (IQ 130) and a deep understanding of the freest societies, I realized what was missing—not only in Russia or the United States but globally—a Bitcoin-native system for tracking debts and financial interactions. This could return control of money to ordinary people and create horizontal connections parallel to state systems. My goal was to create, if not a Bitcoin killer app, then at least to lay its foundation.
At the inauguration event in New York, I rediscovered the Nostr project. I realized it was not only technologically simple and already quite popular but also perfectly aligned with my vision. For the past month and a half, using insights and experience gained since 2014, I’ve been working full-time on this project.
-

@ e3ba5e1a:5e433365
2025-02-13 06:16:49
My favorite line in any Marvel movie ever is in “Captain America.” After Captain America launches seemingly a hopeless assault on Red Skull’s base and is captured, we get [this line](https://www.youtube.com/shorts/kqsomjpz7ok):
“Arrogance may not be a uniquely American trait, but I must say, you do it better than anyone.”
Yesterday, I came across a comment on the song [Devil Went Down to Georgia](https://youtu.be/ut8UqFlWdDc) that had a very similar feel to it:

America has seemingly always been arrogant, in a uniquely American way. Manifest Destiny, for instance. The rest of the world is aware of this arrogance, and mocks Americans for it. A central point in modern US politics is the deriding of racist, nationalist, supremacist Americans.
That’s not what I see. I see American Arrogance as not only a beautiful statement about what it means to be American. I see it as an ode to the greatness of humanity in its purest form.
For most countries, saying “our nation is the greatest” *is*, in fact, twinged with some level of racism. I still don’t have a problem with it. Every group of people *should* be allowed to feel pride in their accomplishments. The destruction of the human spirit since the end of World War 2, where greatness has become a sin and weakness a virtue, has crushed the ability of people worldwide to strive for excellence.
But I digress. The fears of racism and nationalism at least have a grain of truth when applied to other nations on the planet. But not to America.
That’s because the definition of America, and the prototype of an American, has nothing to do with race. The definition of Americanism is *freedom*. The founding of America is based purely on liberty. On the God-given rights of every person to live life the way they see fit.
American Arrogance is not a statement of racial superiority. It’s barely a statement of national superiority (though it absolutely is). To me, when an American comments on the greatness of America, it’s a statement about freedom. Freedom will always unlock the greatness inherent in any group of people. Americans are *definitionally* better than everyone else, because Americans are freer than everyone else. (Or, at least, that’s how it should be.)
In *Devil Went Down to Georgia*, Johnny is approached by the devil himself. He is challenged to a ridiculously lopsided bet: a golden fiddle versus his immortal soul. He acknowledges the sin in accepting such a proposal. And yet he says, “God, I know you told me not to do this. But I can’t stand the affront to my honor. I am the greatest. The devil has nothing on me. So God, I’m gonna sin, but I’m also gonna win.”
*Libertas magnitudo est*
-

@ daa41bed:88f54153
2025-02-09 16:50:04
There has been a good bit of discussion on Nostr over the past few days about the merits of zaps as a method of engaging with notes, so after writing a rather lengthy [article on the pros of a strategic Bitcoin reserve](https://geek.npub.pro/post/dxqkgnjplttkvetprg8ox/), I wanted to take some time to chime in on the much more fun topic of digital engagement.
Let's begin by defining a couple of things:
**Nostr** is a decentralized, censorship-resistance protocol whose current biggest use case is social media (think Twitter/X). Instead of relying on company servers, it relies on relays that anyone can spin up and own their own content. Its use cases are much bigger, though, and this article is hosted on my own relay, using my own Nostr relay as an example.
**Zap** is a tip or donation denominated in sats (small units of Bitcoin) sent from one user to another. This is generally done directly over the Lightning Network but is increasingly using Cashu tokens. For the sake of this discussion, how you transmit/receive zaps will be irrelevant, so don't worry if you don't know what [Lightning](https://lightning.network/) or [Cashu](https://cashu.space/) are.
If we look at how users engage with posts and follows/followers on platforms like Twitter, Facebook, etc., it becomes evident that traditional social media thrives on engagement farming. The more outrageous a post, the more likely it will get a reaction. We see a version of this on more visual social platforms like YouTube and TikTok that use carefully crafted thumbnail images to grab the user's attention to click the video. If you'd like to dive deep into the psychology and science behind social media engagement, let me know, and I'd be happy to follow up with another article.
In this user engagement model, a user is given the option to comment or like the original post, or share it among their followers to increase its signal. They receive no value from engaging with the content aside from the dopamine hit of the original experience or having their comment liked back by whatever influencer they provide value to. Ad revenue flows to the content creator. Clout flows to the content creator. Sales revenue from merch and content placement flows to the content creator. We call this a linear economy -- the idea that resources get created, used up, then thrown away. Users create content and farm as much engagement as possible, then the content is forgotten within a few hours as they move on to the next piece of content to be farmed.
What if there were a simple way to give value back to those who engage with your content? By implementing some value-for-value model -- a circular economy. Enter zaps.

Unlike traditional social media platforms, Nostr does not actively use algorithms to determine what content is popular, nor does it push content created for active user engagement to the top of a user's timeline. Yes, there are "trending" and "most zapped" timelines that users can choose to use as their default, but these use relatively straightforward engagement metrics to rank posts for these timelines.
That is not to say that we may not see clients actively seeking to refine timeline algorithms for specific metrics. Still, the beauty of having an open protocol with media that is controlled solely by its users is that users who begin to see their timeline gamed towards specific algorithms can choose to move to another client, and for those who are more tech-savvy, they can opt to run their own relays or create their own clients with personalized algorithms and web of trust scoring systems.
Zaps enable the means to create a new type of social media economy in which creators can earn for creating content and users can earn by actively engaging with it. Like and reposting content is relatively frictionless and costs nothing but a simple button tap. Zaps provide active engagement because they signal to your followers and those of the content creator that this post has genuine value, quite literally in the form of money—sats.

I have seen some comments on Nostr claiming that removing likes and reactions is for wealthy people who can afford to send zaps and that the majority of people in the US and around the world do not have the time or money to zap because they have better things to spend their money like feeding their families and paying their bills. While at face value, these may seem like valid arguments, they, unfortunately, represent the brainwashed, defeatist attitude that our current economic (and, by extension, social media) systems aim to instill in all of us to continue extracting value from our lives.
Imagine now, if those people dedicating their own time (time = money) to mine pity points on social media would instead spend that time with genuine value creation by posting content that is meaningful to cultural discussions. Imagine if, instead of complaining that their posts get no zaps and going on a tirade about how much of a victim they are, they would empower themselves to take control of their content and give value back to the world; where would that leave us? How much value could be created on a nascent platform such as Nostr, and how quickly could it overtake other platforms?
Other users argue about user experience and that additional friction (i.e., zaps) leads to lower engagement, as proven by decades of studies on user interaction. While the added friction may turn some users away, does that necessarily provide less value? I argue quite the opposite. You haven't made a few sats from zaps with your content? Can't afford to send some sats to a wallet for zapping? How about using the most excellent available resource and spending 10 seconds of your time to leave a comment? Likes and reactions are valueless transactions. Social media's real value derives from providing monetary compensation and actively engaging in a conversation with posts you find interesting or thought-provoking. Remember when humans thrived on conversation and discussion for entertainment instead of simply being an onlooker of someone else's life?
If you've made it this far, my only request is this: try only zapping and commenting as a method of engagement for two weeks. Sure, you may end up liking a post here and there, but be more mindful of how you interact with the world and break yourself from blind instinct. You'll thank me later.

-

@ df478568:2a951e67
2025-02-07 22:34:11
Freedom tech is free and open-source software. It is free as in freedom. A common license in FOSS is the MIT license. It's the license behind Bitcoin, a peer-to-peer electronic cash system. Anyone is free to run this software. The same is true for the software at mempool.space. The software is free to use. I run it on my own server.
This is what I use to time-stamp my articles. You can use it to check transactions on the bitcoin time chain, but you need to trust that I'm not doing any funny business. I'm not, but keep in mind, the whole point of p2p elwctronic cash is that you don't trust. You verify.
The beauty of FOSS is: You don't need to trust me. You can triple-check the transactions you search on my mempool instance by looking at the official mempool.space website and blockchain.info...Or...You can run your own node on your own hardware, free of charge.
Of course, the hardware is not free. Neither is the actual bitcoin. The freedom is built into the software, but as the saying goes, "freedom isn't free." It took me years to learn how to run my own software on my own server and make it available on the clear net.
## SearXNG

[SearXNG](https://github.com/searxng/searxng) is my favorite search engine. I don't like giving up my precious data to big tech located in the United States or China. I run my own search engine. I have noticed certain biases in Google searches. The biggest problem is ads.
Companies tend to pay for Yelp and Google reviews. I called an AC company I found from a local magazine that came in the mail. A portly man wearing an HVAC costume drove to my house in a white van. He had a great smile and even better social skills. The van had a slogan plastered on it like most tradie vans do. "Reviews Matter We have a 4.9 Review on Google." He also had his name painted on this van like a Bomber pilot from WW2. I won't dox him, but it was something like "Joe the closer."
I don't trust the omnipotenence of the Googs. I also don't trust fat men they call "the closer" to give me the best deal. The trick to saving sats is to choose the game-theory optimal way of negogiation.
In DUCY, by David Sklansky, I learned useful negotiation skills. Sklansky wrote classic poker books and applied his actuarial math brain to negotiation techniques. He said he would go to a Toyota dealer and say, "I'm shopping for a new Camry. I already have a price from dealership XYZ in a nearby city. What is your price?"
This changes the dynamic right from the starting line and gives the consumer the advantage. So I tried this based technique with the HVAC industrial complex. I got a quote from 3 people:
1. Joe "The Closer."
2. The Costco-sponsored HVAC Company
3. My SearXNG search results.
In essence, I apply the same logic I learned running a full bitcoin node. Remember how I said the decentralized nature of bitcoin allows you to **triple-check your transactions?** Running SearXNG allows me to triple check my search results in a similar fashion. I don't trust Google, Costco, or the magazine I get every month in the mail. I verify results with my own search engine.
My SearXNG does not track my location, but I set it to give me local results. To be honest, I have not verified this, but the code is on GitHub for everyone to see.
I don't want to be "sold" on an AC. I don't want an AC if I could avoid it, but my AC was as dead as dentacoin. Living in Southern California with a wife going through "the change" gave me no alternative.
The guy I found on SearXNG showed up in an unmarked van. He had a beard. He was not "a closer." He was an actual HVAC technician. He tried cleaning my unit made in the same year Weezer released their Blue album. He said he coukd jerry rig it to get it working for another few months, but the machine is on it's last days. He said a newer unit would also be more efficient so I asked him about the energy like a bitcoiner.
"How many kilowatt hours does it cost me to run my AC versus a new AC?"
I don't remember the exact answer, but I asked all three companies. He was the only one that new how to find out. He also happened to be the cheapest, but I would have bought a new AC from this guy even if he wasn't.
I told him I made a space heater out of a bitcoin miner. He had no idea this was possible, but he at least pretended to find it interesting. That's why I use SearXNG to find tradesmen. It's better than Yelp.
If you would like to try my instance of SearXNG, check it out.
`523FeCpi9Gx4nR9NmSFIMEaYcI5Q4WmhYHPEPaEah84=`
To decrypt it, use the key behind the paywall at:
https://8gwifi.org/CipherFunctions.jsp
npub1marc26z8nh3xkj5rcx7ufkatvx6ueqhp5vfw9v5teq26z254renshtf3g0
[882785](https://mempool.marc26z.com/block/00000000000000000001840e7986ea4b6ea103f5af9b524dc102be926a831dee)
[merch](https://marc26z.com/merch/)
**Follow me on nostr**.
All of my work is available under the Creative Commons 0 licence. If you would like to try my instance of Searxng and do not wish to support my work, find me on habla.news by searching my npub. You can find all of my work there(including encryption keys)free of charge.
# Paywall On Substack
abdominal.savior.repaint
Will decrypt this ciphertext:
523FeCpi9Gx4nR9NmSFIMEaYcI5Q4WmhYHPEPaEah84=
Which will reveal my instance of SearXNG at
https://searxng.marc26z.com/
[Subscribe on Subtack](https://substack.com/@marc26z)
-

@ da0b9bc3:4e30a4a9
2025-02-07 21:38:56
It's Finally here Stackers!
It's Friday!
We're about to kick off our weekends with some feel good tracks.
Let's get the party started. Bring me those Feel Good tracks.
Talk Music. Share Tracks. Zap Sats.
Let's go!
https://youtu.be/6Whgn_iE5uc?si=ArBOHVpKN2OyNf1D
originally posted at https://stacker.news/items/879159
-

@ dbb19ae0:c3f22d5a
2025-02-07 21:38:41
1. Downloading the linux package (1.8GB) https://cortex.so/docs/installation
2. Installing Cortex on linux is done via dpkg
`sudo dpkg -i cortex-1.0.9-linux-amd64-local-installer.deb`
it requires 2 linux packages (will add their names later)
3. When running Cortex,
`cortex start`
a local implementation will be running on http://127.0.0.1:39281
4. Using python it is possible to run queries
make sure the model name is correct
you can double check the value using:
` cortex ps`
Now the python program to run one little query:
``` python
import requests
url = "http://127.0.0.1:39281/v1/chat/completions"
headers = {"Content-Type": "application/json"}
payload = {
"model": "tinyllama:1b-gguf",
"messages": [
{
"role": "user",
"content": "Write a joke"
}
],
"stream": False,
"max_tokens": 128,
"stop": ["End"],
"frequency_penalty": 0.2,
"presence_penalty": 0.6,
"temperature": 0.8,
"top_p": 0.95,
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
```
-

@ 2685c45c:8bc01bfd
2025-02-07 20:06:57
## 1. Abstract
A society is a group of individuals (members) who abide by common rules.
A democracy is a society where members strive for rules defined with the maximum consciousness and consensus.
To increase awareness, such a society must be completely transparent.
The key challenge is to find the most consensual set of rules. Members could themselves decide:
- Who to admit or exclude from membership
- Which rules to submit for approval
- How to approve proposed rules
The proposed software does not:
- Interpret the meaning of the rules
- Prevent from having inconsistent sets of rules
- Impose a governance structure
Rather, it could be viewed as:
- A framework for defining and running a society (a constitution)
- A ledger which records all rules, votes and members in one place
A client accessing the blockchain can, at any time, know:
- The rights and duties of any member
- The connections between members
- The voting history of any member
In summary, the software enables a web of trust on a blockchain used for voting.
## 2. A blockchain
### 2.1 Why using a blockchain
The core of any society lies in maintaining an up-to-date registry of its members (1 member = 1 pubkey), along with their respective rights and duties. This information is recorded on a distributed blockchain.
The advantages of using a distributed blockchain are:
- No single central authority/server in charge of publishing society updates
- Each block is a time unit to define anteriorities and thereby freeze the state of the society
Unlike Bitcoin, there is no financial incentive to participate in the network. Instead, stakeholders may be motivated by their desire:
- To support a society
- To join a society
- To remain part of a society
### 2.2 Structure of a block
Members issue objects (as bitcoiners issue transactions) that are first stored in a mempool, prior to being 'blockchainized'.
A Block has three parts:
- Header
- Hash of the signature of the preceding block
- Object counter
- Merkle root of the below objects
- Content
- All objects sorted
- Footer
- Signature of the block header (by the author of the block)
Unlike Bitcoin:
- There is no nonce
- Objects must be arranged following an hard-coded sorting method
- A block must have at least one object (no upper limit: no block size)
- A block must be signed by its author
- The hash of the signature constitutes the 'chain' connecting the 'blocks'
> *@readers*
>
> We call 'block hash' the hash of the block's signature.
>
> In this paper, for clarity, the ideas of object's issuer and author are one.
### 2.3 Consensus mechanism
Like in Bitcoin, the branch with the most leading zeros in its block hashes is the legitimate branch. To prevent spam, a block (at height n) will be relayed only if its hash is less than the one currently stored at height n.
Block authors may choose to omit certain (available in mempool) objects from a block, as they would increase the block hash value. However, statistically, these excluded objects will contribute to lower a future block hash.
Block time is agreed upon by members. Block authors should stick to this pace. Those who don't may be causing inconvenience for others, but won't compromise the consensus. Repeat offenders can be easily identified through their block signatures and could get banned.
### 2.4 Consensus attack
An attack on the consensus can:
- Censor a controversial object
- Disrupt the chronology of the blockchainized objects
A block author, attempting to manipulate the blockchain, can compute a malicious object solely designed to reduce his block hash. This tactic ensures that the maliciously created block will be accepted as part of the legitimate branch. This attack could be repeated on all future blocks. Some other attacks on the consensus are possible.
A trustless blockchain requires POW. **But, the proposed blockchain is not trustless as it records a web of trust**. When needed, members will vote for the block they consider legitimate and it will contravene the default consensus rule. Actually, the real risk lies in members not trusting each other.
## 3. Objects
### 3.1 Common format
Objects are JSONs.
There are:
- 5 different objects that can be recorded in the blockchain
- 1 pseudo object that constitutes the blockchain
The JSONs have standardized keys, known as 'attributes'. One of these is called 'core', which contains a further dictionary with its own standardized keys, known as 'fields'.
> *@readers*
>
> - 'Pop' is abbreviated from 'population'
> - 'Admin' is abbreviated from 'administration'
### 3.2 Link
A link is created by 2 members signing their pubkeys. The web of trust comprises all these links. It serves as a civil registry.
### 3.3 Admin
An admin:
- Grants some members permission to issue some objects (even other admins)
- Defines criteria for the issued objects approval (votes requirements)
The set of approved admins defines the constitution of the society.
Any core of an admin must have these fields:
- Member: Pop of members allowed to issue objects
- Boundary: Limitations on the issued objects
- Approval: Vote requirements for the issued objects approval
### 3.4 Law
A law is a human interpretable free text which applies to a defined pop of members.
Any core of a law must have these fields:
- Member: Pop of members on whom the law applies
- Content: The content of the law
### 3.5 Vote
A vote may concern any object (even another vote).
Any core of a vote must have these fields:
- Object: Pop of objects being voted
- Side: The 'yes' or 'no' vote itself
If a member votes twice on the same object, only the first one will count. To counteract this, the member would need to void his first vote.
### 3.6 Void
A void is used to temporarily or permanently ignore objects (even other voids).
Any core of a void must have these fields:
- Object: Pop of objects to be ignored
- Duration: Time period expressed in blocks, can be infinite
Modifying an already blockchainized object requires to:
1. Void the object
2. Issue a newly created object with the wished modifications
Once an admin is voided:
- The children objects are unaffected
- The voided admin cannot issue any further object
The genesis admin, JSON object automatically created at system setup, grants full permissions to founding members. It allows them to create the first admins. Once this has been done, the genesis admin should be permanently voided.
A member exists only by his links. Voiding all these means banning this member.
> *@readers:*
>
> - 'Member pop' means 'pop of members'
> - 'Object pop' means 'pop of objects'
### 3.7 Block
A block is a pseudo object as it is not recorded in the blockchain but constitutes it.
Like other objects:
- An admin can grant some members permission to issue blocks
- Issuing votes or voids concerning blocks can be allowed
But unlike other objects:
- Blocks do not possess explicit attributes like other JSON objects
- The program implicitly assigns a 'type' attribute to blocks
- Approved and voided blocks impact the default consensus rule
Actually, the program identifies the legitimate branch according to the consensus rule (maximum cumulative heading 0), with these constraints:
- All approved blocks must be part of this branch
- This branch must not pass through any voided block
In case of fork attack:
- Block voters can vote for the right forking block
- Block voiders could reconsider this decision voiding the approved forking block (trust crisis)
> *@devs:*
>
> Approving/voiding blocks can lead to a rollback. Only genesis block is not approvable/voidable.
## 4. Attributes
### 4.1 Path
Each object originates from the core of an admin which originates from the core of a parent admin. This continues until the genesis admin is reached. All objects and cores have an id. The path of an object A consists of all these ids: from the genesis admin till the id of A.
Two blockchainized objects can't have the same path. In order to reduce conflicts, it can be advisable to choose large random numbers as ids.
### 4.2 Type
An object can have only one type.
A block always has the default type 'block'. A JSON object can't have this type.
### 4.3 Author
This attribute stores the list of pubkeys of the members who wrote the object.
Except for links, which must have exactly two authors, other objects can have from 1 to n authors.
### 4.4 Label
This attribute allows members to tag objects. Members shall agree on standardized tags: tax, justice... They could even tag objects as belonging to an ideology or party. It would ease the work for voters who need guidance.
### 4.5 Context
In addition to storing and relaying objects, servers can optionally store aside free texts and relay them as well. They provide explanations (such as contextual information) about the issued objects. This attribute enables linking a free text (through its hash) to an object.
### 4.6 Core
All objects possess between 1 and n cores - though links which do not have one. They define the political essence of the objects. Practically, a core is a dictionary where allowed fields (keys) depend on the object type.
### 4.7 Signature
Before object issuance, each member whose the pubkey is in the author list must sign all previously described attributes. This attribute stores the list of these signatures.
### 4.8 Digest
| level | key | value | uniqueness | mandatory |
| - | - | - | - | - |
| 1 | path | list of ids | yes | yes |
| 1 | type | 'link' or 'admin' or 'law' or 'vote' or 'void' | yes | yes |
| 1 | author | list of pubkeys | yes | yes |
| 1 | label | string of plain word(s) | yes | no |
| 1 | context | string of an hash | yes | no |
| 1 | core-n | dict of fields | no | yes, except for links |
| 1 | signature | list of signatures | yes | yes |
> *@devs:*
>
> In this paper, a list refers to a string where items are separated by commas without any blank space.
>
> Such lists are well suited for regex parsing.
### 4.9 Example
The object below describes an admin with the id 29 originating from:
- The core 3 of the admin 7 which originates from
- The core 0 of the admin 0 (the genesis admin)
This admin:
- Is created by two members
- Is tagged with the words 'trade' and 'justice'
- Has a context file associated
- Has two signatures
```
{
'path': '0-0,7-3,29',
'type': 'admin',
'author': '15a3b72c,b52d6e1a',
'label': 'trade justice',
'context': '5bc953e0',
'core-0': <This core allows to issue laws>,
'core-1': <This core allows to issue votes concerning the core-0 laws>,
'signature': '827d65b7,3c65da6b'
}
```
## 5. Member field
### 5.1 Applications
The field member defines a member pop. It is used in:
- Admin cores: Define who can issue objects
- Law cores: Define who is concerned by the law
### 5.2 Composing pops
Member pops can be composed using algebra of sets. Two keys are used:
- Operand: A member pop
- Operator: An operator (arity = 2)
An operand is a dictionary that:
- Defines a basic pop
- Applies methods to this basic pop to adjust it
Operators are either:
- '+': Union: Merge two member pops
- '-': Complement: Subtract from the first pop the members in the second pop
- '&': Intersection: Keep only the members who are in both pops
The simplest composition consists of just one operand. However, as shown in the following example, complex compositions (with priority rules) are also possible:
- The operand-0 pop is the intersection of two other pops
- The final pop is the operand-0 pop minus the operand-1 pop
```
'core-0':
|--'member':
|--'operand-0':
| |--'operand-10': ...
| |--'operator-10': '&'
| |--'operand-11': ...
|--'operator-0': '-'
|--'operand-1': ...
```
### 5.3 Defining a basic pop
These keys define a basic pop:
- Base: Set a starting point to define the pop
- Value: Define an argument to complete the base key
- Future: Define whether the pop will evolve after object blockchainization
The base key has these possible values:
- Allmembers:
- Includes all non banned members of the society
- Useful for widespread rights/duties (i.e., the right to issue links)
- Omits the value key
- Nomember:
- Doesn't include any member
- Useful for giving rights/duties to few members or to members with specific locations in the graph
- Supposed to be used with the method 'name' to add members to the pop
- Omits the value key
- Issuing:
- Includes all members who have issued or co-issued objects belonging to a defined object pop
- Useful for giving rights/duties to members according to their past actions
- The value key must store an object pop
- Pointing:
- Points to an existing member pop
- Useful for readability
- The value key must store the path to an admin or law core
The future key has these possible values:
- Dynamic: The pop is recomputed at each new block by the program
- Static: The pop is computed at the time of object blockchainization, only future voided links can still impact it
### 5.4 Adjusting a basic pop
#### 5.4.1 Common format
These keys define a method:
- Method: The method's name
- Arg: The argument passed to the method
As several methods can be applied to the same basic pop, these keys are suffixed. These suffixes specify the methods order execution.
#### 5.4.2 Name method
It adds or removes the specified members from the basic pop.
The arg must be a list of pubkeys prefixed by:
- '+': Add member
- '-': Remove member
The program ignores added members who have been banned.
Two keywords can be used instead of a pubkey:
- @self: It denotes the pubkey(s) of the author(s) of the object
- @center: It denotes the pubkey(s) of the member(s) located at the whole graph center
> *@thinkers:*
>
> Does the center of the web of trust best reflect the values of the society?
#### 5.4.3 Radius method
It adds or removes members from the basic pop (which is a graph) based on how far they are from its center. The arg must be a positive or negative integer:
- n: Radius + n links
- -n: Radius - n links
If given basic pop is a disconnected graph, the method is applied to each subgraph.
> *@devs:*
>
> The distance between 2 members is the minimum number of links to join these 2 members.
>
> The center of a graph is composed of the members who have the smallest distance to all other members.
>
> The radius of a graph is this smallest distance.
#### 5.4.4 Degree method
It adds or removes members from the basic pop according to their number of links within it. This method can be used to exclude members not well integrated within the basic pop.
The arg must be an integer which serves as a comparison:
- n: n or more links
- -n: n or less links
> *@readers:*
>
> An integer which serves as a comparison is called a 'comparator'.
### 5.5 Digest
| level | key | value | uniqueness | mandatory |
| - | - | - | - | - |
| 2 | member | dict with below level-3 keys | yes | yes |
| 3 | operand-n | dict with below level-4 keys | no | yes |
| 4 | base | 'allmembers' or 'nomember' or 'issuing' or 'pointing' | yes | yes |
| 4 | value | base='issuing', object pop <br> base='pointing', path to a core | yes | base='issuing'/'pointing', yes <br> base='allmembers'/'nomembers', no |
| 4 | future | 'dynamic' or 'static' | yes | yes |
| 4 | method-n | 'name' or 'radius' or 'degree' | no | no |
| 4 | arg-n | method='name', list of +/- prefixed pubkeys <br> method='radius', integer (-inf,+inf) <br> method='degree', comparator (-inf,+inf)| no | any method requires an arg |
| 3 | operator-n | '+' or '-' or '&' | no | no |
### 5.6 Examples
The following example shows the union of two pops, forming the final member pop.
The first pop is dynamic: it is re-computed at each new block. It includes:
- All members within 20 hops radius around the graph's center
- With at least 3 links within this 'extended central' pop
The second pop references an existing member pop: the core-1 pop of the law or admin 2, itself originating from the core 0....until the genesis admin. The referenced pop could be dynamic. However, this second pop is static.
```
'core-0':
|--'member':
| |--'operand-0':
| | |--'core': 'nomember'
| | |--'future': 'dynamic'
| | |--'method-0': 'name'
| | |--'arg-0': '+@center'
| | |--'method-1': 'radius'
| | |--'arg-1': 20
| | |--'method-2': 'degree'
| | |--'arg-2': 3
| |--'operator': '+'
| |--'operand-1':
| | |--'core': 'pointing'
| | |--'future': 'static'
| | |--'value': '0-0,5-2,3-0,2-1'
```
The following example shows a pop comprising a single operand. It includes:
- The object's author(s)
- All his (their) current neighbors up to 5 hops away
```
'core-0':
|--'member':
| |--'operand-0':
| | |--'core': 'nomember'
| | |--'future': 'dynamic'
| | |--'method-0': 'name'
| | |--'arg-0': '+@self'
| | |--'method-1': 'radius'
| | |--'arg-1': 5
```
## 6. Approval field
### 6.1 Application
The approval field is used in the admin cores. It specifies voting requirements for issued objects approval.
Approved objects have varying implications depending on their types:
- Link: Only approved links comprise the graph (the web of trust)
- Admin: Only approved admins can issue objects
- Law: Once approved, a law applies to concerned members
- Vote: Only approved votes counts to meet voting requirements
- Void: Once approved, objects concerned by the void are ignored (voided)
- Block: The legitimate branch must pass through the approved blocks
> *@devs:*
>
> Except for laws, approved objects affect program behavior.
### 6.2 Defining approval requirements
These keys define an approval field:
- Quorum: Minimum percentage of voters required among eligible voters
- Strength: Minimum percentage of 'yes' votes required among all votes
The values of these keys are comparators between 0 and 100. If both values are equal to zero, it means that once blockchainized, the object is approved.
The pop of eligible voters can be spread across multiple admin cores. It can also be dynamic, maintaining a perpetual approval uncertainty.
> *@thinkers:*
>
> Should new eligible voters have the automatic right to challenge existing approved rules ?
### 6.3 Digest
| level | key | value | uniqueness | mandatory |
| - | - | - | - | - |
| 2 | approval | dict with below level-3 keys | yes | yes |
| 3 | quorum | comparator [0,100] | yes | yes |
| 3 | strength | comparator [0,100] | yes | yes |
### 6.4 Example
In the following example, the approval requirements are:
- At least 50% of the eligible voters must vote
- At least 70% of the votes must be 'yes' votes
```
'core-0':
|--'approval':
| |--'quorum': 50
| |--'strength': 70
```
## 7. Content field
The content field is used in the law cores. It's a text open to human interpretation defining the content of a law.
| level | key | value | uniqueness | mandatory |
| - | - | - | - | - |
| 2 | content | free text | yes | yes |
## 8. Object field
### 8.1 Applications
The object field defines an object pop. It is used for these objects:
- Vote: Define the objects voted
- Void: Define the objects to ignore
Object pops can be composed in the same way as member pops (same operators).
### 8.2 Defining an object pop
An object pop is a dictionary where key names mirror some attribute and field names. These keys act as filters (criteria) to select relevant objects.
An object pop includes all objects that:
- Satisfy criteria at attribute level
- Have **at least one core** that satisfies all criteria at field level
Meeting a criterion depends on its type:
- Regex: Full match with mirrored attribute or field
- Pop: Include mirrored pop
Depending on the criteria, object pops can be static or dynamic. However, issuing votes or voids concerning a dynamic object pop means voting or voiding non yet issued objects! UX should prevent this risk.
### 8.3 Digest
| level | key | value | uniqueness | mandatory |
| - | - | - | - | - |
| 2 | object | dict with below level-3 keys | yes | yes |
| 3 | operand-n | dict with below level-4 keys | no | yes |
| 4 | path | regex | yes | no |
| 4 | type | regex | yes | no |
| 4 | author | member pop | yes | no |
| 4 | label | regex | yes | no |
| 4 | member | member pop | yes | no |
| 4 | object | object pop | yes | no |
| 4 | side | regex | yes | no |
| 3 | operator-n | '+' or '-' or '&' | no | no |
### 8.4 Examples
The following example shows an object pop, including objects:
- Originating from the core 2 of the admin 9 (itself originating from the genesis admin)
- With ids from 0 to 5
- That are voids or laws
- That have the word 'CUSTO' in their labels
```
'core-0':
|--'object':
| |--'path': '0-0,9-2,[0-5]'
| |--'type': 'void|law'
| |--'label': '.*CUSTO.*'
```
The following example shows an object pop which includes any object originating from the core 2 of the admin 9. It includes eventual admins and their children objects. This kind of dynamic object pops should be used carefully.
```
'core-0':
|--'object':
| |--'path': '0-0,9-2,.*'
```
The following example could be an extract of a vote which concerns voids:
- Originating from the core 5 of the admin 8
- Issued (or co-issued) by any member currently located within a 3-hop radius around the member 4f52da24
- Concerning laws originating from the cores 0 to 4 of the admin 8
```
'core-0':
|--'object':
| |--'operand':
| | |--'path': '0-0,8-5,[0-9]*'
| | |--'type': 'void'
| | |--'author':
| | | |--'operand':
| | | | |--'base': 'nomember'
| | | | |--'behavior': 'dynamic'
| | | | |--'method-0': 'name'
| | | | |--'arg-0': '+4f52da24'
| | | | |--'method-1': 'radius'
| | | | |--'arg-1': 3
| | |--'object':
| | | |--'operand':
| | | | |--'path': '0-0,8-[0-4]'
| | | | |--'type': 'law'
```
> *@thinkers:*
>
> A vote concerning voids which concern laws.
>
> Getting the hang of it requires some mental effort!
## 9. Side field
The side field is used in the vote cores. It tells whether it's a yes or no vote.
| level | key | value | uniqueness | mandatory |
| - | - | - | - | - |
| 2 | side | 'yes' or 'no' | yes | yes |
## 10. Duration field
### 10.1 Application
The duration field is used in void cores. It specifies how long the program ignores the voided object.
### 10.2 Defining duration
The duration field can have these values:
- 0: Voided objects are forever ignored
- n (with n>0): Voided objects are ignored during n blocks
The timeframe starts after void approval.
### 10.3 Digest
| level | key | value | uniqueness | mandatory |
| - | - | - | - | - |
| 2 | duration | integer [0,+inf) | yes | yes |
## 11. Boundary field
### 11.1 Application
The boundary field is used in admin cores. It limits the objects that can be issued.
These keys define a boundary field:
- Content: To restrict the content of the issued objects
- Amount: To limit the amount of objects issued
An object that does not fully respect the boundary field will be rejected by the network.
### 11.2 Restricting content
The content key stores a dictionary where key names mirror some attribute and field names. These keys act as criteria to filter the objects that can be issued. These objects must:
- Satisfy criteria at attribute level
- Have **all their cores** satisfying criteria at field level
Blocks possess only the type attribute. Therefore, a content restriction on blocks can only allow or forbid issuance.
Meeting a criterion depends on its type:
- Regex: Full match with mirrored attribute or field
- Pop: Include mirrored pop
- Comparator: Respect comparison logic
- Boundary:
- This criterion type is used to limit the boundary field of a meta-admin
- A meta-admin is an admin that can generate child admins
- It consists of the same data as a boundary field
- All the restrictions of the mirrored boundary field must be more stringent
> *@devs:*
>
> A regex can be more stringent than another one. For example, '[0-9]{2}' is more stringent than '[0-9]+'. Boundary criterion requires to code such a regex assessor.
### 11.3 Restricting amount
These keys define the amount restriction:
- Scope:
- Meaning: The below restrictions can be either per member or for the whole member pop
- Value: Either the string 'each' or the string 'all'
- Maximum:
- Meaning: Maximum number of issued objects (excluding issued objects voided)
- Value: A negative non null comparator
- Frequency:
- Meaning: Required time gap (expressed in blocks) between object issuance
- Value: A positive or null comparator
### 11.4 Digest
| level | key | value | uniqueness | mandatory |
| - | - | - | - | - |
| 2 | boundary | dict with below level-3 keys | yes | yes |
| 3 | content | dict with below level-4 keys | yes | no |
| 4 | path | regex | yes | no |
| 4 | type | regex | yes | no |
| 4 | author | member pop | yes | no |
| 4 | label | regex | yes | no |
| 4 | member | member pop | yes | no |
| 4 | approval | dict with below level-4 keys | yes | no |
| 5 | quorum | comparator [0,100] | yes | no |
| 5 | strength | comparator [0,100] | yes | no |
| 4 | object | object pop | yes | no |
| 4 | duration | comparator (-inf,+inf) | yes | no |
| 4 | boundary | boundary | yes | no |
| 3 | amount | dict with below level-3 keys | no | no |
| 4 | scope | 'all' or 'each' | yes | no |
| 4 | maximum | comparator (-inf,-1] | yes | no |
| 4 | frequency | comparator [0,+inf) | yes | no |
> *@devs:*
>
> The comparator for duration has a quirk. Indeed, a zero duration means forever.
### 11.5 Examples
The boundary field in the following example allows to issue laws:
- That include the word 'medicine' in their labels
- That concern all current and future members (or any sub-pop of this pop)
```
'core-0':
|--'boundary':
| |--'content':
| | |--'type': 'law'
| | |--'label': '.*medicine.*'
| | |--'member':
| | | |--'operand-0':
| | | | |--'base': 'allmembers'
| | | | |--'future': 'dynamic'
```
The admin core described in the following example:
- Allows all current and future members
- To issue links
- That are automatically approved
The amount of issued links is limited:
- Up to 8 links maximum per member (excluding issued links voided)
- Each member must wait 1,095 blocks between two links
```
'core-0':
|--'member':
| |--'operand-0':
| | |--'base': 'allmembers'
| | |--'future': 'dynamic'
|--'boundary':
| |--'content':
| | |--'type': 'link'
| |--'amount':
| | |--'scope': 'each'
| | |--'maximum': 8
| | |--'frequency': 1095
|--'approval':
| |--'quorum': 0
| |--'strength': 0
```
The admin core described in the following example:
- Allows all current and future members
- To issue voids
- That are automatically approved
These voids must:
- Have the exact value 'unlink' as label
- Concern links written by the void author and his direct neighbors
This admin core allows each member to void his own links. Motivations might be:
- The loss of confidence in a direct neighbor
- The death of a direct neighbor
- The wish to opt-out from the society
```
'core-0':
|--'member':
| |--'operand-0':
| | |--'base': 'allmembers'
| | |--'future': 'dynamic'
|--'boundary':
| |--'content':
| | |--'type': 'void'
| | |--'label': 'unlink'
| | |--'object':
| | | |--'operand-0':
| | | | |--'type': 'link'
| | | | |--'author':
| | | | | |--'operand-0':
| | | | | | |--'base': 'nomember'
| | | | | | |--'future': 'dynamic'
| | | | | | |--'method-0': 'name'
| | | | | | |--'arg-0': '+@self'
| | | | | | |--'method-1': 'radius'
| | | | | | |--'arg-1': 1
|--'approval':
| |--'quorum': 0
| |--'strength': 0
```
The meta-admin core described in the following example:
- Allows 3 members
- To issue admins
- That require votes to be approved (80-30)
These admins:
- Allow some members (center + 50 hops and 6 or more links)
- To issue laws
- That require votes to be approved (60-50)
These laws:
- Must include the word 'newcomer' in their labels
- Must concern all members with 3 or less links
```
'core-0':
|--'member':
| |--'operand-0':
| | |--'base': 'nomember'
| | |--'future': 'static'
| | |--'method-0': 'name'
| | |--'arg-0': '+d15a4c8f,+4867ae22,+a1f8c7d4'
|--'boundary':
| |--'content':
| | |--'type': 'admin'
| | |--'member':
| | | |--'operand-0':
| | | | |--'base': 'nomember'
| | | | |--'future': 'dynamic'
| | | | |--'method-0': 'name'
| | | | |--'arg-0': '+@center'
| | | | |--'method-1': 'radius'
| | | | |--'args-1': 50
| | | | |--'method-2': 'degree'
| | | | |--'arg-2': 6
| | |--'boundary':
| | | |--'content':
| | | | |--'type': 'law'
| | | | |--'label': '.*newcomer.*'
| | | | |--'member':
| | | | | |--'operand-0':
| | | | | | |--'base': 'allmembers'
| | | | | | |--'future': 'dynamic'
| | | | | | |--'method-0': 'degree'
| | | | | | |--'arg-0': '-3'
| | |--'approval':
| | | |--'quorum': 60
| | | |--'strength': 50
|--'aproval':
| |--'quorum': 80
| |--'strength': 30
```
> *@thinkers:*
>
> We don't recommend creating short-lived admins.
>
> A sturdy constitution (set of admins), is the hallmark of good governance.
## 12. Staying united
### 12.1 Membership feeling
Using a web-of-trust to register members has several effects on social dynamics, including boosting the sense of community. Moreover, the more governance reflects members preferences, the greater this effect becomes.
### 12.2 Banning a member
To prevent banned members from reappearing with new identities (new pubkeys), doxing them is essential.
A highly adversarial environment would demand such caution:
1. Any member can denunciate a suspect to 'initiators'
2. 'Initiators' decide whether to issue a void concerning the links of the suspect
3. 'Neighbors' of the suspect should reveal his identity to the 'initiators'
4. 'Initiators' issue a report on the suspect to the 'judges'
5. 'Judges' vote for or against the void
6. If the void is approved, the suspect is banned and the initiators issue a law to dox him
Ideally:
- Communications in steps 1, 3 and 4 should be encrypted for the intended recipients
- Neighbors should cooperate with initiators to avoid raising suspicions!
- The report sent to judges should be anonymized
Organizing the ban process in real life can be much more simple but it entails risks. Social enginery can mitigate these risks.
### 12.3 Sybill attack
An attacker could assume several identities. To tackle this problem, above banning process applies with these exceptions:
- Several suspects are involved
- Reports can't be anonymized
### 12.4 Adversarial environment
This chapter explores a high-risk use case: breaking free from an oppressive and centralized state. In this context, decentralization and anonymity are essential to survive.
A society is as strong and attractive as its members being supportive of each other. This involves fostering an exclusive commercial environment. Businesses need to be encouraged while keeping members' privacy concerns paramount. In an extreme scenario, producers should trade only with their direct neighbours, who endorse the role of trader with their own direct neighbours, thus mirroring the graph's topology.
Encrypting blockchain content to restrict access to members only is a misguided approach. It creates an air of mystery around the society's intentions, fuelling fear instead. To counter this, it's crucial to showcase the society's benevolent intentions, thereby undermining central state oppression and making the system as appealing as possible.
The state might anyway hinder the development of such a society. In response, members could adopt this defensive strategy:
1. Dox on chain low-level managers overseeing state violence and their supports
2. Halt solidarity with doxed people until they give up doing evil
3. Update the list of doxed people
4. Attract operators of the resigned managers to enforce justice in their own society
> *@thinkers:*
>
> We believe **total** social exclusion produces better outcomes than physical violence. We **never** encourage the latter.
## 13. Conclusion
We have proposed a system for a decentralized and pseudonymous society where a built-in script language provides unparalleled flexibility in designing the constitution. Only hands-on use can demonstrate its value. The potential impact on human organizations is considerable and we urge careful consideration. All lives matter.
## 14. ANNEX 1: UX
### 14.1 A UX per use case
Any political venture vulnerable to central powers could fall back on the proposed software:
- Collaborative encyclopaedia
- Sport association or committee
- ...
Devs could share customized plugins for each use case. A plugin comprises:
- A set of pre-built objects
- A UX
Incorporating a plugin into the software would make a big difference in terms of usability:
- Wizard for society setup (constitution)
- Template objects to reuse/customize
- Template pops and regex to reuse/customize
- Simplified interface for voting
- ...
A draft, generic, by default, UX is detailed below.
### 14.2 Main view
```
+--------------------------------------------------------------------------+
| url: https://www.node_accepting_connections_from_some_trusted_members.io |
+-------------------------+------------------------------------------------+
| Member focused | |
| -------------- | o---------o---------o-------o-----o------o |
| | \ /|\ / \ / /| | |
| [Enter here a pubkey] | \ / | \ / \ / / | | |
| | \ / | o / \ / / | o | |
| States considered | \ / | \ / / / | / | |
| ----------------- | o----|----o / \ / | / | |
| | | / \ / \ / |/ | |
| [ ] Mempool | | / \ / o------o------o |
| [x] Blockchainized | | / \ / | | |
| [x] Approved | |/ o-------o------o |
| [ ] Voided | o |
| | |
+-------------------------+------------------------------------------------+
| Understand | Behave | Act |
|--------------------------------------------------------------------------|
| |
| These 3 tabs are explained further |
| |
+--------------------------------------------------------------------------+
```
The main view is divided into three sections:
- Focus: Set global settings
- Graph: Display the web of trust
- Explorer: Explore and create objects
Focus section affects both Graph and Explorer sections that:
- Adopt the selected member's point of view
- Show only objects with the desired states
The explorer section is divided into three tabs.
### 14.3 Understand tab
```
+-------------------------+------------------------------------------+------------------------------------+
| Tree | Children | Content |
+-------------------------+------------------------------------------+------------------------------------+
| v id 0 | Select | id | type | label | Status | v attributes |
| |-v core 0 |------------------------------------------| |-> path: 0-0,1-0,0-0,2 |
| | |-v id 0 | ( ) | 0 | law | cadaster | approved | |-> type: law |
| | | |-> core 0 | ( ) | 1 | law | cadaster | approved | |-> ... |
| | | |-> core 1 | (x) | 2 | law | cadaster | approved | |-v core 0 |
| | |-v id 1 | ( ) | 3 | void | cadaster | approved | | |-v member |
| | | |-v core 0 |------------------------------------------| | | |-v operand 0 |
| | | | |-v id 0 | | | | | |-> base: allmembers |
| | | | | |-> >>core 0<< | | | | | |-> future: dynamic |
| | | | | |-> core 1 | | | | |-v content |
| | | +--------------------------------+ |
| | | | Upon approval of this law, | |
| | | | a45br7h6 will become the owner | |
| | | | of property 8394144 | |
| | | +--------------------------------+ |
+-------------------------+------------------------------------------+------------------------------------+
```
The Understand tab serves as an object explorer. It is divided into three panels:
- Tree: Tree of all admins
- Children: Children objects of the selected item in the Tree panel:
- An admin: A list of the cores of this admin
- A core: A list of the objects originating from this core
- Content: Content of the selected item in the Children panel:
- A core: The JSON content of this core
- An object: The JSON content of this object
- No selection: The JSON content of the selected admin or core in the Tree panel
### 14.4 Behave tab
```
+---------------------------------------------------------+-------------------------------------------+
| Regulation | Content |
+---------------------------------------------------------+-------------------------------------------+
| Label filter: [Add text to filter objects i.e. 'tax'] | v attributes |
|---------------------------------------------------------| |-> path: 0-0,2-0,6 |
| Select | path | label | status | |-> type: law |
|---------------------------------------------------------| |-> issuer: 2dac829k, b7ff56ff |
| ( ) | 0-0,1-2,3-4,5 | tax water | approved | |-> label: tax property |
| (x) | 0-0,2-0,6 | tax property | blockchainized | |-> context: s7w7y89f |
| ( ) | 0-0,3-4,0-2,5 | foreigner tax | mempool | | | |-v operand 0 |
|---------------------------------------------------------| | | | |-> base: allmembers |
| | | | | |-> future: dynamic |
| | | | |-v content |
| | +---------------------------------------+ |
| | | Monthly payment expected: | |
| | | - Amount: 500¥ per square meter owned | |
| | | - Address: 3dsh4r44 | |
| | | Well indicate your pubkey in the tx | |
| | +---------------------------------------+ |
|---------------------------------------------------------+-------------------------------------------+
```
The Behave tab enables access to all laws concerning the selected member. It is divided into three panels:
- Regulation: All laws concerning the selected member
- Content: JSON content of the selected law
### 14.5 Act tab
```
+-------------------------+-----------------------------------+---------------------------------------+
| Tree | Content | Writer |
+-------------------------+-----------------------------------+---------------------------------------+
| v id 0 | v core | v attributes |
| |-v core 0 | |-v member | |-> path: 0-0,1-0,0-0,[Add id] |
| | |-v id 0 | | |-v operand 0 | |-> type: vote |
| | | |-> core 0 | | | |-> base: nomember | |-> pubkey: 78cq32hu, [Add cosigner] |
| | | |-> core 1 | | | |-> future: dynamic | |-> label: [Add label] |
| | |-v id 5 | | | |-> method 0: name | |-> context: [Add hash] |
| | | |-v core 2 | | | |-> arg 0: +@center | |-v core 0 |
| | | | |-v id 3 | |-v boundary | | |-v object |
| | | | | |-> core 6 | | |-v content | | | |-v operand 0 |
| | | | | |-> >>core 7<< | | | |-> type: vote | | | | |-> path: [Add regex] |
| | | | |-v object | | |-> side: [Add 'yes' or 'no'] |
| | | | | |-v operand 0 | |
| | | | | | |-> path: 0-0,5-2,3-6,.+ | +----------+ |
| | |-v approval | | Add core | |
| | | |-> quorum: 0 | +----------+ |
| | | |-> strength: 0 | +-----------------------+ |
| | | | Sign and issue object | |
| | | +-----------------------+ |
+-------------------------+-----------------------------------+---------------------------------------+
```
The Act tab enables to write and issue objects. It is divided into three panels:
- Tree: Tree of the admins where the selected member has issuance rights
- Content: JSON content of the core selected
- Creator: Form to write an object (require privkey; the selected member = the visitor)
-

@ b83a28b7:35919450
2025-02-07 18:59:54
Avi Burra’s *24* is an ambitious and intricately woven narrative that blends mystery, philosophy, and technology into a modern odyssey. At its heart, the novel is a deeply personal story about grief, identity, and legacy, but it also serves as a meditation on the interplay between cryptography, art, and human connection. Burra’s debut novel is as much a puzzle as it is a journey of self-discovery, with its protagonist, Oliver Battolo, unraveling a twenty-four-word seed phrase left behind by his enigmatic father—a key to both a vast Bitcoin fortune and deeper truths about life.
---
### **The Plot: A Cryptographic Quest**
The novel begins with Oliver grappling with the death of his father, Nate Battolo. At Nate’s funeral, Oliver discovers a cryptic message instructing him to find twenty-four words. These words form the seed phrase to a Bitcoin wallet. Guided by Maren, a spiritual healer and family friend, Oliver learns “time projection,” a meditative technique that allows him to access symbolic memories and alternate realities. Through these projections and real-world encounters, Oliver uncovers the twenty-four words while unraveling his father’s hidden life as an early contributor to Bitcoin.
As the narrative progresses, Oliver uncovers shocking truths about his father’s role in the early days of Bitcoin. Alongside this technological intrigue are surrealist elements tied to Jonathan Bryce’s cryptographic paintings, which serve as both literal and metaphorical keys to unlocking Nate’s secrets.
---
### **Themes: A Philosophical Mosaic**
Burra masterfully interweaves several themes throughout *24*, including:
- **Grief and Legacy**: The novel explores how Oliver processes his father’s death while uncovering Nate’s hidden life. The journey forces him to reconcile his father’s flaws with his brilliance.
- **Identity and Reinvention**: From Nate’s transformation into “Nate Battolo” at Princeton to Oliver’s own self-discovery, the novel examines how identities are shaped by choices and circumstances.
- **Philosophy and Non-Duality**: The enigmatic Noncemeister—a surreal guide representing collective consciousness—teaches Oliver about interconnectedness and non-duality, echoing traditions like Advaita Vedanta and Zen Buddhism.
- **Cryptography Meets Art**: Jonathan Bryce’s paintings symbolize hidden knowledge waiting to be deciphered, blending surrealist aesthetics with cryptographic principles.
- **Moral Complexity**: The Bitcoin fortune represents both opportunity and burden, forcing Oliver to grapple with ethical dilemmas about wealth, surveillance, and personal responsibility.
---
### **Strengths**
Burra excels at creating a layered narrative that balances intellectual depth with emotional resonance. The philosophical musings of the Noncemeister are thought-provoking without being didactic, offering readers insights into non-duality and existentialism. The integration of cryptography into the plot is seamless; even readers unfamiliar with Bitcoin will find themselves intrigued by its implications for freedom and control. Additionally, the novel’s surrealist elements—particularly the time projection episodes—are vividly described and lend the story an otherworldly quality.
The relationship between Oliver and his father is particularly compelling. Through flashbacks and projections, Nate emerges as a complex figure—brilliant yet flawed—whose decisions ripple through Oliver’s life in unexpected ways. This emotional core grounds the novel amidst its more abstract explorations.
---
### **Weaknesses**
While *24* is undeniably ambitious, its complexity may alienate some readers. The dense philosophical passages—though rewarding for those who enjoy intellectual challenges—can feel overwhelming at times. Similarly, the technical details about Bitcoin and cryptography might be difficult for readers unfamiliar with these topics.
The ending leaves several threads unresolved, including the fate of two additional Bryce paintings hinted at in the epilogue. While this ambiguity adds to the novel’s mystique, it may frustrate readers seeking closure.
---
### **Conclusion**
*24* is a bold debut that defies easy categorization. Part mystery, part philosophical treatise, part technological exploration—it is a novel that challenges its readers while rewarding their patience. Avi Burra has crafted a story that is as much about finding twenty-four words as it is about finding oneself. With its intricate plot, rich themes, and memorable characters, *24* establishes Burra as a writer to watch.
For readers who enjoy intellectual puzzles wrapped in emotional depth—think Haruki Murakami meets Neal Stephenson—*24* is an unforgettable journey worth taking.
-

@ abab50be:430cd35d
2025-02-07 18:45:32
Setup up my NIP-05... Hoping this works!
originally posted at https://stacker.news/items/879027
-

@ 3b7fc823:e194354f
2025-02-07 18:42:31
### Privacy in Public Spaces: A Tactical Guide
#### 1. Public Wi-Fi Privacy
Using public Wi-Fi can be convenient, but it's important to take precautions to protect your privacy:
- **Use a VPN (Virtual Private Network)**: A VPN encrypts your internet traffic, making it difficult for hackers to intercept your data.
- **Disable Automatic Connections**: Prevent your device from automatically connecting to open Wi-Fi networks by turning off this feature in your settings.
- **Avoid Sensitive Transactions**: Refrain from accessing banking or other sensitive accounts while connected to public Wi-Fi.
- **Use Secure Websites**: Look for "https://" in the website's URL to ensure it uses encryption.
- **Keep Software Updated**: Ensure your device's operating system and apps are up-to-date to protect against security vulnerabilities.
#### 2. Surveillance Camera Awareness
Surveillance cameras are common in public spaces. Here are some strategies to maintain your privacy:
- **Spotting Cameras**:
- **Look for Signs**: Many establishments post signs indicating the presence of surveillance cameras.
- **Camera Placement**: Cameras are often placed near entrances, exits, and high-traffic areas. Look for dome-shaped cameras on ceilings or wall-mounted cameras.
- **Using Masks and Coverings**:
- **Face Masks**: Wearing a mask can help obscure your facial features from facial recognition systems.
- **Hats and Sunglasses**: A hat can shield your face from overhead cameras, while sunglasses can hide your eyes.
- **Covering Identifying Marks**:
- **Clothing Choices**: Wear clothing that doesn't have distinctive logos or patterns that can easily identify you.
- **Blend In**: Opt for styles and clothing choices that helps you blend in with your surroundings, reducing your visibility.
- **Temporary Coverings**: Consider using temporary coverings, such as scarves or hoods, to conceal tattoos or other identifying marks.
#### 3. General Privacy Tips in Public Spaces
- **Be Mindful of Your Surroundings**: Pay attention to your environment and be aware of any unusual behavior or devices that may be capturing your information.
- **Limit Personal Information**: Avoid discussing sensitive information in public where it can be overheard.
- **Use Encrypted Messaging Apps**: Apps like Signal or SimpleX offer end-to-end encryption for your messages, making it harder for eavesdroppers to intercept your conversations.
- **Use Privacy Screens**: Privacy screens on all of you electronic screens can defend against the over the shoulder peek or side eye.
- **Avoiding Behaviors**: Be mindful of behaviors that could make you a target, such as frequent visits to certain areas or engaging in conversations that might attract unwanted attention.
Taking these steps can help you maintain your privacy while navigating public spaces and using public Wi-Fi. Remember, staying informed and vigilant is key to protecting your personal information.
---
Advocating for privacy does not finance itself. If you enjoyed this article, please consider zapping or sending monero
82XCDNK1Js8TethhpGLFPbVyKe25DxMUePad1rUn9z7V6QdCzxHEE7varvVh1VUidUhHVSA4atNU2BTpSNJLC1BqSvDajw1
-

@ 1cb14ab3:95d52462
2025-02-07 16:41:54
***Tree branches, driftwood coconut. 5'7" teardrop. [Dawei, Myanmar. 2020]***
---
#### Introduction
Situated on Myanmar’s Grandfather Beach, this lens captures the dramatic shape of a steep, rocky hill that mirrors the arduous road leading to this remote location. Grandfather invites viewers to reflect on the connection between journey and destination, highlighting the tension and beauty of paths less traveled.
#### Site & Placement
The lens is positioned at the west end of the beach, focusing on the sharp hill rising above the shoreline. Its teardrop shape accentuates the rocky prominence, emphasizing its similarity to the road that winds toward the beach. A bench, placed 12 feet away, provides a place for viewers to absorb the rugged beauty of the scene.
#### Impermanence & Integration
Crafted from driftwood, branches, and stone, Grandfather is a fleeting presence in this timeless landscape. Its brief existence reflects the challenges and ephemerality of the journey it highlights, blending into the environment as it gradually succumbs to the elements.
#### Reflection
*Grandfather* invites viewers to consider the parallels between the physical journey to reach the beach and life’s broader paths. It stands as a reminder that even the most challenging routes can lead to moments of profound beauty.
---
## Photos








---
#### More from the 'Earth Lens' Series:
[Earth Lens Series: Artist Statement + List of Works](https://hes.npub.pro/post/1731091744332/)
["Looking Glass" (Earth Lens 001)](https://hes.npub.pro/post/1736304563962/)
["Folsom" (Earth Lens 002)](https://hes.npub.pro/post/1737844073125/)
["Sanctuary" (Earth Lens 003)](https://hes.npub.pro/post/1731091744332/)
["Platte" (Earth Lens 004)](https://hes.npub.pro/post/sya8nv6q8k0w3olqcepwz)
[COMING SOON: "Chongming" (Earth Lens 006)](https://hes.npub.pro/post/1731091744332/)
---
#### More from Hes
[Portfolio](https://hesart.npub.pro)
[Online Store](https://plebeian.market/community/hes@nostrplebs.com/hesmart-ym3fcufdfz)
[Artist Statements](https://hes.npub.pro/tag/art/)
[Travel Guides](https://hes.npub.pro/tag/travel/)
[Photography](https://hes.npub.pro/tag/photography)
[Money](https://hes.npub.pro/tag/money)
[Tech](https://hes.npub.pro/tag/tech)
---
*All images are credit of Hes, but you are free to download and use for any purpose. If you find joy from my art, please feel free to send a zap. Enjoy life on a Bitcoin standard.*
-

@ f683e870:557f5ef2
2025-02-07 14:33:31
After many months of ideation, research, and heads-down building, <span data-type="mention" data-id="726a1e261cc6474674e8285e3951b3bb139be9a773d1acf49dc868db861a1c11" data-label="nostr:npub1wf4pufsucer5va8g9p0rj5dnhvfeh6d8w0g6eayaep5dhps6rsgs43dgh9">@nostr:npub1wf4pufsucer5va8g9p0rj5dnhvfeh6d8w0g6eayaep5dhps6rsgs43dgh9</span> and myself are excited to announce our new project called Vertex.
**Vertex’s mission is to provide developers and builders with the most up-to-date and easy-to-use social graph tools**.
Our services will enable our future customers to improve the experience they provide by offering:
- Protection against **impersonation** and **DoS attacks**
- Personalized **discovery** and **recommendations**.
All in an open, transparent and interoperable way.
## Open and Interoperable
We have structured our services as [NIP-90 Data Vending Machines](https://github.com/nostr-protocol/nips/blob/master/90.md). We are currently using [these DVMs](https://vertexlab.io/docs/nips) and we are eager to hear what the community thinks and if anyone has suggestions for improvements.
Regardless of their specific structures, using DVMs means one very important thing: **no vendor lock-in**.
Anyone can start processing the same requests and compete with us to offer the most accurate results at the best price. This is very important for us because we are well aware that services like ours can potentially become a central point of failure. The ease with which we can be replaced by a competitor will keep us on our toes and will continue to motivate us to build better and better experiences for our customers, all while operating in an ethical and open manner.
Speaking of openness, we have released **all of our code under the [MIT license](https://spdx.org/licenses/MIT.html)**, which means that anyone can review our algorithms, and any company or power user can run their own copies of Vertex if they so wish.
We are confident in this decision because the value of Vertex is not in the software. It is in the team who designed and implemented it – and now continually improves, manages and runs it to provide the most accurate results with the lowest latency and highest uptime.
# What we offer
We currently support three DVMs, but we plan to increase our offering substantially this year.
1. `VerifyReputation`: give your users useful and personalized information to asses the reputation of an npub, minimizing the risk of impersonations.
2. `RecommendFollows`: give your users personalized recommendations about interesting npubs they might want who to follow.
3. `SortAuthors`: give your users the ability to sort replies, comments, zaps, search results or just about anything using authors’ reputations.
To learn more, watch this 3-minute walk-through video, and [visit our website](https://vertexlab.io/)
https://cdn.satellite.earth/6efabff7da55ce848074351b2d640ca3bde4515060d9aba002461a4a4ddad8d8.mp4
We are also considering offering a custom service to help builders clarify and implement their vision for Web of Trust in their own applications or projects. Please reach out if you are interested.
-

@ 5d4b6c8d:8a1c1ee3
2025-02-07 14:32:43
Ate a little later yesterday.
I took my daughter for a scooter ride on a trail near our house (I was walking) and she wanted to go farther than normal. Great for the steps challenge. Then, as soon as we turned around to go home, she decided she was too tired to scoot anymore. So, I got to do the return leg of the walk carrying both the kid and her scooter.
We were out about an hour longer than expected, hence the later meal.
## Score Card
Day 1: 14 hour fast (13 dry)
Day 2: 15 hour fast (14 dry)
Day 3: 17 hours (16 dry)
Day 4: 18 hours (17 dry)
Day 5: 18 hours (16 dry)
Day 6: 19 hours (16 dry)
Day 7: TBD (15 dry)
originally posted at https://stacker.news/items/878700
-

@ 5d4b6c8d:8a1c1ee3
2025-02-07 14:02:05
Apparently, there's still another NFL game and, I suppose, we have to discuss it.
I'm much more excited to get into all the NBA trades that happened.
Who got better?
Who got worse?
Who did something really weird?
Of course, we'll talk about the contests going on in the territory.
MLB's ramping up. Can anyone challenge the Dodgers?
Ovi is trying to get back on pace to break NHL's career scoring record.
Any bets we're excited about
Plus, whatever the stackers want us to cover (time and memory permitting)
originally posted at https://stacker.news/items/878674
-

@ a367f9eb:0633efea
2025-02-07 10:39:28
Issued on January 23, 2025, Staff Accounting Bulletin 122 rescinds SAB 121, [originally issued](https://www.sec.gov/oca/staff-accounting-bulletin-121) by Gensler in March 2022. The previous bulletin provided guidance for financial entities and custodians holding any “crypto-assets,” requiring them to account for all cryptocurrencies primarily as liabilities on their balance sheets, rather than assets.
The revoking of SAB 121 empowers entities to assess whether their crypto-assets are classified as liabilities only if they believe a loss is probable.
For bitcoin holders who hold their own keys and run their own node, this distinction and its subsequent repeal made little difference.
But for the budding world of Bitcoin banking and finance, as well as the booming industry of custodial wallets and brokerages, it’s a game changer.
Rather than having to match cryptocurrency deposits one-for-one with other liquid assets in the case of a contingency, the new accounting guidance frees up institutions to mark the true values of crypto-assets on their books.
Rather than having to buy up $1 million in treasuries or cash in order to hold $1 million in bitcoin or cover losses, firms will now be able to recognize that $1 million as a true asset.
It may not seem like a revolution, but it may be the beginning of our bull-inspired Bitcoin banking era.
After years of byzantine persecutions of cryptocurrency developers, entrepreneurs, and ever-increasing regulations on Bitcoin, this paradigm shift at the nation’s premier markets regulator means traditional finance can finally include bitcoin and its crypto-offspring in its suite of financial products – with some caveats.
Practically, this rather benign-sounding rule lowers the barrier of entry for entities that want to offer bitcoin services to their customers. Whether it’s a bank, an exchange, or a liquidity service provider custodying funds, there is now a more sustainable path for offering bitcoin alongside any other type of account.
While a general crypto market framework is still far from established in law, the current situation grants fairness between both fiat money and cryptocurrencies in the hands of entrepreneurs who want to custody funds for their clients.
Practically, however, what does this mean for the average bitcoiner?
## **What will my Bitcoin bank look like?**
If we take a peek over at Europe, there are already FinTech firms and banking institutions that offer some level of bitcoin services.
Xapo Bank, a private bank headquartered in Gibraltar, [offers](https://www.xapobank.com/en) each customer a traditional bank account and IBAN number alongside an instantaneous deposit and withdrawal address for Bitcoin and Bitcoin Lightning, Tether, and USDC.
Considering Xapo [built](https://decrypt.co/8449/coinbase-acquires-xapo-crypto-custodian) the doomsday-proof custody vaults for bitcoin storage later bought by Coinbase in 2019, now the preferred institutional custodian for billions in assets, it’s easy to see why so many customers trust their custody.
And for those willing to make the tradeoff for custody of their funds, they do offer something attractive.
In a single account, a customer could deposit cash, exchange it to bitcoin, and withdraw to self-custody. They could also deposit bitcoin using Lightning, and then instantly convert that amount to send a traditional bank transfer to pay their rent or utility bills for those who don’t yet accept bitcoin.
Again, this may not be the solution for those who [prefer self-custody](https://www.btcpolicy.org/articles/self-custody-is-nonnegotiable), but it does offer an integrated fiat on and off ramp that others may find convenient.
Similarly, the UK-based FinTech firm Revolut offers its customers the [ability](https://www.revolut.com/crypto/) to deposit and withdraw their bitcoin within the app, as well as exchange it for whichever fiat currency they wish. For those who currently hold bitcoin in an ETF or some other custodial product, a move to an app such as this may be even more attractive.
And we already know US companies are begging to expand their own services to their customers.
Companies such as **Strike** and **Fold** have already begun to increase their Bitcoin banking services for American customers, offering account and routing numbers for [bill pay](https://strike.me/blog/announcing-strike-bill-pay/), as well as the ability to instantly swap between currencies if they wish.
Fold has the [ambition](https://blog.foldapp.com/fold-to-go-public/) to become one of the nation’s largest publicly-traded bitcoin financial services, looking to soon add mortgage and lending offers, as well as insurance solutions.
These financial firms will offer bitcoin for purchase, lending, and exchange, but we can also assume their suite of products will become more diverse and attractive for a more diverse customer base.
## **What about sovereign money?**
Educating Americans about the benefits of Bitcoin is an important task. So is improving our policy landscape so that all bitcoiners may flourish.
But if the Bitcoin network truly represents a revolutionary way to have and use neutral money, should we even consider Bitcoin banks something we want? How can peer-to-peer money integrate with the centralized custodial banking system so many of us are trying to escape?
Even the most primitive advantages of Bitcoin are built on its ability to be owned in a sovereign way, at the total exclusion of everyone who doesn’t have the private key. For many of us, this is all we desire and want. And for the rights to hold and use Bitcoin how we wish to be universally recognized.
However, we cannot dictate how the rest of our Bitcoin peers will engage with the network, nor what they inscribe into blocks if they have the computing power to mine them. If Bitcoin entrepreneurs freely compete to offer unique products and services to custody, trade, or lend bitcoin, the rules should make that easier and more possible.
For those who will still need to interact with the fiat world, they should be able to benefit from Bitcoin-first products and services designed with them in mind. And regulations should empower them rather than restrict what they can do.
Not every Bitcoin banking product will be attractive to every bitcoiner and that’s okay. But the positive evolution of e-cash, custodial services, lending, and insurance is something that will help leverage the power of Bitcoin. And that should be championed.
*Yaël Ossowski is a fellow at the Bitcoin Policy Institute.*
This article was originally published at the [Bitcoin Policy Institute](https://www.btcpolicy.org/articles/has-the-era-of-bull-inspired-bitcoin-banking-already-begun).
-

@ 6ad3e2a3:c90b7740
2025-02-07 08:17:18
When I used to work in fantasy sports, people would ask me questions about their teams, e.g., which players to start, who to drop. What they didn’t realize is I had seven of my own teams to worry about, was already living and dying with my own myriad choices, good and bad, I made every week. The last thing I needed was to make a decision for them, see it go bad and suffer more on their account.
I’d tell them, “You decide, I’ve got my own problems.”
. . .
I don’t know what I’m doing. Ideas which feel like insights come to me, I try to articulate them to my satisfaction and post them (with some editing help from Heather.) Often I feel like I should be producing more work — after all, I don’t have a job any more, I have plenty of time. Walking the dog, exercising, managing your finances, picking up the kid, putting food on the table (literally) is well and good, but fulfilling your duties is not enough. You need to stay in the game. What game is up to each person, but it should be a game you enjoy, one that draws on skills honed over decades by the accident of your particular interests.
. . .
Writing and ideas can’t be produced on demand. I mean they can — and I did it for 22 years on a particular topic — but I don’t mean that kind of writing. I don’t want a schedule. I don’t need more rules, more discipline, more “hacks.” Discipline is like the interest on a 30-year mortgage. Initially it’s most of the payment, but over time it cedes weight to understanding which is like the principal. Discipline without understanding is like an interest-only mortgage. You pay it every month and get nowhere.
Even when insights arrive they can’t always be articulated sufficiently and coherently. Many insights are of the one sentence variety — fine for a social media post, but you can’t send out an email newsletter 10 times per day with one sentence insights. It doesn’t work over that medium.
That’s a dilemma because posting on social media doesn’t feel like proper work. Yes, you’re reaching people, affecting the zeitgeist in whatever small way — but there’s something addictive and unsatisfying about it, like eating candy instead of food. Don’t get me wrong, I stand by my posts (consider them organic, artisanal candy) but shitposting and the immediate feedback received therefrom keeps you only on the periphery. I need to connect with something deeper.
. . .
I’ve spent a lot of time dissecting the various pathologies of the laptop class, of which I’m obviously a part as I literally type this in a coffee shop on my laptop! The need to believe they are empathic and good overwhelming any rational sense-making and basic morals. Men dominating women’s sports, child sex changes, forced injections, criminals running rampant, cities in decay, calls for censorship and funding for foreign wars. The authorities patted them on the back, their peers accepted them and their overlords promoted them so long as they hewed to the narrative.
The freakout we’re presently witnessing is not about the billions in taxpayer money no longer being sent for DEI training in some foreign country, i.e., money-laundering to favored interests and cronies. They’re not really upset FBI agents are being fired, secrets are being revealed, that we are finally making an effort to prevent fentanyl from flowing across the border and killing our fellow citizens. These are good things, and even if you don’t agree, none of it is grounds for the meltdowns I see every day on social media.
What’s really happening is people who were assured they were the “good”, the empathic, the compassionate ones, those who towed the line during covid, got their boosters, wore their masks, “social distanced,” put pronouns in their bios, are being confronted with a terrifying realization: the behaviors and beliefs, to which they so dutifully attached themselves, for which they publicly and stridently advocated, whether online or at Thanksgiving dinner, are no longer being rewarded. In fact, they are being openly ridiculed. Instead of the pat on the back, increasingly Team Good is facing mockery and outright scorn.
There will be no legal consequences. No one will be arrested or put in a camp, delusions of persecution notwithstanding. If you produce real value for a real employer, you are not at risk of being fired. If you insist on perpetuating your derangement on social media you will not be deplatformed or canceled (that only happens to people speaking the truths inconvenient to the powerful.)
No, the reality is in some ways far worse: your entire worldview, on which you staked your self-image, is being dismantled in real time. You are no longer “good,” it’s becoming obvious to most the policies for which you advocated were catastrophic, the politicians for whom you voted deeply cynical and corrupt. The gaping abyss within your being to which you attached this superstructure of self-affirmation is dissolving into thin air. You are not “superior” like you thought, you are just another person suffering and existing like everyone else. And your only choices are to face that daunting reality or cling to a dying and useless paradigm, the end game for which is only madness.
We all want to feel good about ourselves, and like an obese person drugging themselves with high-fructose corn syrup for years, you have gorged on the distorted approbation of a sick society that, unpleasantly for you, is starting to heal. Your first laps around the track, so to speak, are going to hurt a lot.
. . .
I probably went on too long about the laptop class freakout. I have a lot of resentment toward the way they behaved the last five years. But I started this essay with the idea that I have my own problems, and in the end, I am not much different from them.
I want to produce more work, and of higher quality, but to what end? To feel good about my contributions, to have a sense that I am “good.” Maybe it’s not “good” in the lame “I complied with authority, and everyone likes me” kind of way, but it arises from the same source. That source is the emptiness within, wherein we require accolades, dopamine, positive feedback as a kind of justification for our existence. “No, I am not squandering my time on earth, living a comfortable life, I am asking hard questions, connecting with people, sharing hard-won insights. I am useful! I am good! I got my sixth dopamine booster from writing yet another essay!”
. . .
There is an irony in writing this piece. I feel as I type the cathartic nature of expressing these feelings. I am doing something worthwhile, everything is flowing out of me, the minutes are sailing by. I am identifying and solving this thorny problem simultaneously, engaging with the emptiness and dissatisfaction. The solution isn’t in the output, whatever one might think of it, it’s in giving attention to the feelings I’ve squandered too much time avoiding. I feel unworthy not because I do not produce enough work, it turns out, but because I am unwilling to connect with my deepest nature.
. . .
No matter how uneasy you feel, no matter how much fundamental doubt you have about your value as a human being, you can always start where you are. The feeling of unworthiness, the need for an escape, the craving for some kind of reward from your peers or the authorities or whatever easily-consumed carbohydrates you have in the kitchen is simply the present state in which you find yourself. It is not wrong or bad, it just is. And what is can always be examined, observed, given attention. Attending to that discomfort is always within reach.
. . .
The last thing I want to do is write an essay, face a purgatory of sitting down and consciously putting my feelings into words. It’s so much easier to distract oneself with all the news about the world, check 100 times a day the price of bitcoin and my other investments. But purgatory is the only way out of hell. The hell of wanting to succeed, of wanting to become “good.”
For some, that astroturfed worldview they so painstaking affixed to their empty souls is dissolving toward a revelation of the emptiness beneath. And unsurprisingly they are freaking out. But I’ve wasted too much time arguing with them, pointing out the ways in which they’re misinformed, driven by fear and derelict in their basic epistemic responsibilities. If you want to hold onto the lies you were told, knock yourself out. I’ve got my own problems.
-

@ d57360cb:4fe7d935
2025-02-06 18:31:30
Mindfulness often has the misconception that by practicing you can stop your mind from thinking and obtain an empty mind.
While one can definitely achieve moments of emptiness in thinking, this view that emptiness is the goal can be the very obstacle in your way leading to frustration with the practice.
If we adjust our perspective and see mindfulness as learning to accept the situations we find ourselves in and adjust to them rather than fighting them, we achieve a kind of grace under pressure.
The thoughts are part of the practice, just like cars on the road are part of driving, or the danger of a punch is always a threat to a boxer.
The difference between the novice and the seasoned is one has accepted and acclimated to the realities of the situation instead of fighting them, in this one finds freedom.
-

@ 21ffd29c:518a8ff5
2025-02-05 21:42:14
The concept of "Sovereigns: The Power of Your Thoughts - Navigating the Journey from Awareness to Creation" can be beautifully integrated with the empowering strength of strong masculine energy. This synergy combines personal empowerment with a sense of assertiveness and confidence, guiding individuals toward their desired reality.
1. **Understanding Sovereignty**: Sovereignty in this context refers to the ability to shape one's life and reality through thought. It emphasizes personal control over external circumstances by influencing inner beliefs and perceptions.
2. **Strong Masculine Energy**: This energy is characterized by assertiveness, confidence, power, and a sense of leadership. It aligns with traits like courage, determination, and self-assurance. In the context of empowerment, it encourages individuals to take charge of their lives with strength and clarity.
3. **Integration of Concepts**:
- Personify sovereignty as a strong, authoritative figure who guides personal growth by helping others master their thoughts and create their reality.
- Emphasize the role of masculine energy in cultivating assertiveness, confidence, and leadership qualities that empower individuals to align their thoughts with their desires.
4. **Practical Steps**:
- **Mindfulness**: Practice observing thoughts and actions with clarity and calmness, fostering a state of present awareness.
- **Affirmations**: Use positive statements to reinforce self-confidence and shift belief systems towards empowerment.
- **Visualization**: Imagine desired outcomes and focus on actionable steps to achieve them, embodying the courage and determination associated with masculine energy.
- **Seeking Guidance**: Engage mentors or coaches who can provide support and clarity, reinforcing leadership qualities and assertiveness.
5. **Benefits**:
- Empowerment: Gain control over your life's direction and outcomes through mindful thought manipulation.
- Clarity & Focus: Achieve a clear vision of goals and paths towards them with confidence and determination.
- Confidence & Success: Build self-assurance from aligning actions with inner strength and assertiveness.
- Fulfillment & Peace: Experience inner satisfaction from creating a life that resonates with personal values and energy.
6. **Addressing Concerns**:
- Clarify that while beliefs influence perception, true transformation requires consistent effort and awareness of one's inner strength.
- Emphasize that thoughts can shape reality positively when aligned with assertiveness and confidence.
7. **Conclusion**: Empower yourself today to shape an extraordinary future by understanding the power of your thoughts as a tool for personal growth. Cultivate strong masculine energy through mindfulness, affirmations, visualization, and leadership qualities, guiding yourself toward a life aligned with your inner strength and determination.
By merging the concepts of sovereignty and strong masculine energy, we create a powerful framework that not only empowers individuals but also encourages them to lead lives that reflect their inner confidence and assertiveness.
-

@ aade47fd:281e8e4f
2025-02-04 17:27:47
Сюрприз! Оказалось, что мне потребовалось две недели для того, чтобы сделать вторую запись в свой ЕЖЕДНЕВНИК. Раньше после такого оглушительного провала бросил бы это дело, но задачей дневника было формирование дисциплины, а не сам дневник. Нет ничего удивительного в том, что дисциплины на ежедневные записи не хватило сразу: буду стараться писать как можно чаще пока не выйду устойчиво на ежедневные публикации.
---
### Я на Сахалине
Вчера, третьего февраля, мы с отцом прилетели на Сахалин. Планирую провести здесь около трех-четырех месяцев, на пару летних месяцев вернусь в Питере (ве-ло-си-пед), а в августе снова на остров. Здесь очень много работы, а отвлекаться практически не на что. Именно то, что мне сейчас нужно.
---
### Личность
Есть я. Есть не я. Граница между мной и не мной — моя личность. Это структура, через которую внешний мир возействует на меня, а я на него. Над личностью можно и нужно работать. В конечном счете, я верю, что больше ни на что непосредственным образом мы не влияем. Мир это поток случайных событий и состояний. Уверен, что в моменте мы ничего не решаем — все реакции готовы заранее. Их подготовка — наша ответственность. В этом и заключается формирование личности. Можно сказать, что сформированная личность это стена, и чем она выше и прочнее, тем устойчивее твое бытие. С жадностью тащи камни для этой стены: любое решение и дело должно первостепенной целью ставить собственное развитие, а только потом уже внешний результат. Слабая личность пропускает в тебя все проклятия окружающего мира, делая жизнь жалкой и отправленной. Так бывает с теми, кто ставит ценности мира над своими собственными. Жаль, что я понял это так поздно. Повезло, что я понял это вообще. Здесь, на Сахалине, у меня будет время решить, чем наполнять мою жизнь, а что отвергать.
---
### Амбиции
Помню, что еще лет двадцать назад у слова "амбиции" было исключительно негативный смысл. Надеюсь, мы окончательно ушли от этого. Амбиции это аппетит к жизни. Человек без амбиций — полуживой, тень своего зомби. Такого невозможно полюбить. Новость для меня оказалась в том, что речь здесь идет не только о мужчинах: недавно я потерял интерес и симпатию к женщине не обнаружив в ней амбиций к развитию. Не ставлю на людях крест, я и сам провел много лет в таком состоянии, но лучше я буду двигаться один, чем стану пытаться кого-то растолкать. Спрашивают, может ли всемогущий Бог создать такой камень, который сам не смог бы поднять? Отвечаю: да, этот камень — человек.
---
На сегодня все. Встретимся завтра!
-

@ 91bea5cd:1df4451c
2025-02-04 17:24:50
### Definição de ULID:
Timestamp 48 bits, Aleatoriedade 80 bits
Sendo Timestamp 48 bits inteiro, tempo UNIX em milissegundos, Não ficará sem espaço até o ano 10889 d.C.
e Aleatoriedade 80 bits, Fonte criptograficamente segura de aleatoriedade, se possível.
#### Gerar ULID
```sql
CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE FUNCTION generate_ulid()
RETURNS TEXT
AS $$
DECLARE
-- Crockford's Base32
encoding BYTEA = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
timestamp BYTEA = E'\\000\\000\\000\\000\\000\\000';
output TEXT = '';
unix_time BIGINT;
ulid BYTEA;
BEGIN
-- 6 timestamp bytes
unix_time = (EXTRACT(EPOCH FROM CLOCK_TIMESTAMP()) * 1000)::BIGINT;
timestamp = SET_BYTE(timestamp, 0, (unix_time >> 40)::BIT(8)::INTEGER);
timestamp = SET_BYTE(timestamp, 1, (unix_time >> 32)::BIT(8)::INTEGER);
timestamp = SET_BYTE(timestamp, 2, (unix_time >> 24)::BIT(8)::INTEGER);
timestamp = SET_BYTE(timestamp, 3, (unix_time >> 16)::BIT(8)::INTEGER);
timestamp = SET_BYTE(timestamp, 4, (unix_time >> 8)::BIT(8)::INTEGER);
timestamp = SET_BYTE(timestamp, 5, unix_time::BIT(8)::INTEGER);
-- 10 entropy bytes
ulid = timestamp || gen_random_bytes(10);
-- Encode the timestamp
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 0) & 224) >> 5));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 0) & 31)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 1) & 248) >> 3));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 1) & 7) << 2) | ((GET_BYTE(ulid, 2) & 192) >> 6)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 2) & 62) >> 1));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 2) & 1) << 4) | ((GET_BYTE(ulid, 3) & 240) >> 4)));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 3) & 15) << 1) | ((GET_BYTE(ulid, 4) & 128) >> 7)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 4) & 124) >> 2));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 4) & 3) << 3) | ((GET_BYTE(ulid, 5) & 224) >> 5)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 5) & 31)));
-- Encode the entropy
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 6) & 248) >> 3));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 6) & 7) << 2) | ((GET_BYTE(ulid, 7) & 192) >> 6)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 7) & 62) >> 1));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 7) & 1) << 4) | ((GET_BYTE(ulid, 8) & 240) >> 4)));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 8) & 15) << 1) | ((GET_BYTE(ulid, 9) & 128) >> 7)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 9) & 124) >> 2));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 9) & 3) << 3) | ((GET_BYTE(ulid, 10) & 224) >> 5)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 10) & 31)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 11) & 248) >> 3));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 11) & 7) << 2) | ((GET_BYTE(ulid, 12) & 192) >> 6)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 12) & 62) >> 1));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 12) & 1) << 4) | ((GET_BYTE(ulid, 13) & 240) >> 4)));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 13) & 15) << 1) | ((GET_BYTE(ulid, 14) & 128) >> 7)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 14) & 124) >> 2));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 14) & 3) << 3) | ((GET_BYTE(ulid, 15) & 224) >> 5)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 15) & 31)));
RETURN output;
END
$$
LANGUAGE plpgsql
VOLATILE;
```
#### ULID TO UUID
```sql
CREATE OR REPLACE FUNCTION parse_ulid(ulid text) RETURNS bytea AS $$
DECLARE
-- 16byte
bytes bytea = E'\\x00000000 00000000 00000000 00000000';
v char[];
-- Allow for O(1) lookup of index values
dec integer[] = ARRAY[
255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 0, 1, 2,
3, 4, 5, 6, 7, 8, 9, 255, 255, 255,
255, 255, 255, 255, 10, 11, 12, 13, 14, 15,
16, 17, 1, 18, 19, 1, 20, 21, 0, 22,
23, 24, 25, 26, 255, 27, 28, 29, 30, 31,
255, 255, 255, 255, 255, 255, 10, 11, 12, 13,
14, 15, 16, 17, 1, 18, 19, 1, 20, 21,
0, 22, 23, 24, 25, 26, 255, 27, 28, 29,
30, 31
];
BEGIN
IF NOT ulid ~* '^[0-7][0-9ABCDEFGHJKMNPQRSTVWXYZ]{25}$' THEN
RAISE EXCEPTION 'Invalid ULID: %', ulid;
END IF;
v = regexp_split_to_array(ulid, '');
-- 6 bytes timestamp (48 bits)
bytes = SET_BYTE(bytes, 0, (dec[ASCII(v[1])] << 5) | dec[ASCII(v[2])]);
bytes = SET_BYTE(bytes, 1, (dec[ASCII(v[3])] << 3) | (dec[ASCII(v[4])] >> 2));
bytes = SET_BYTE(bytes, 2, (dec[ASCII(v[4])] << 6) | (dec[ASCII(v[5])] << 1) | (dec[ASCII(v[6])] >> 4));
bytes = SET_BYTE(bytes, 3, (dec[ASCII(v[6])] << 4) | (dec[ASCII(v[7])] >> 1));
bytes = SET_BYTE(bytes, 4, (dec[ASCII(v[7])] << 7) | (dec[ASCII(v[8])] << 2) | (dec[ASCII(v[9])] >> 3));
bytes = SET_BYTE(bytes, 5, (dec[ASCII(v[9])] << 5) | dec[ASCII(v[10])]);
-- 10 bytes of entropy (80 bits);
bytes = SET_BYTE(bytes, 6, (dec[ASCII(v[11])] << 3) | (dec[ASCII(v[12])] >> 2));
bytes = SET_BYTE(bytes, 7, (dec[ASCII(v[12])] << 6) | (dec[ASCII(v[13])] << 1) | (dec[ASCII(v[14])] >> 4));
bytes = SET_BYTE(bytes, 8, (dec[ASCII(v[14])] << 4) | (dec[ASCII(v[15])] >> 1));
bytes = SET_BYTE(bytes, 9, (dec[ASCII(v[15])] << 7) | (dec[ASCII(v[16])] << 2) | (dec[ASCII(v[17])] >> 3));
bytes = SET_BYTE(bytes, 10, (dec[ASCII(v[17])] << 5) | dec[ASCII(v[18])]);
bytes = SET_BYTE(bytes, 11, (dec[ASCII(v[19])] << 3) | (dec[ASCII(v[20])] >> 2));
bytes = SET_BYTE(bytes, 12, (dec[ASCII(v[20])] << 6) | (dec[ASCII(v[21])] << 1) | (dec[ASCII(v[22])] >> 4));
bytes = SET_BYTE(bytes, 13, (dec[ASCII(v[22])] << 4) | (dec[ASCII(v[23])] >> 1));
bytes = SET_BYTE(bytes, 14, (dec[ASCII(v[23])] << 7) | (dec[ASCII(v[24])] << 2) | (dec[ASCII(v[25])] >> 3));
bytes = SET_BYTE(bytes, 15, (dec[ASCII(v[25])] << 5) | dec[ASCII(v[26])]);
RETURN bytes;
END
$$
LANGUAGE plpgsql
IMMUTABLE;
CREATE OR REPLACE FUNCTION ulid_to_uuid(ulid text) RETURNS uuid AS $$
BEGIN
RETURN encode(parse_ulid(ulid), 'hex')::uuid;
END
$$
LANGUAGE plpgsql
IMMUTABLE;
```
#### UUID to ULID
```sql
CREATE OR REPLACE FUNCTION uuid_to_ulid(id uuid) RETURNS text AS $$
DECLARE
encoding bytea = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
output text = '';
uuid_bytes bytea = uuid_send(id);
BEGIN
-- Encode the timestamp
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 0) & 224) >> 5));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 0) & 31)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 1) & 248) >> 3));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(uuid_bytes, 1) & 7) << 2) | ((GET_BYTE(uuid_bytes, 2) & 192) >> 6)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 2) & 62) >> 1));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(uuid_bytes, 2) & 1) << 4) | ((GET_BYTE(uuid_bytes, 3) & 240) >> 4)));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(uuid_bytes, 3) & 15) << 1) | ((GET_BYTE(uuid_bytes, 4) & 128) >> 7)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 4) & 124) >> 2));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(uuid_bytes, 4) & 3) << 3) | ((GET_BYTE(uuid_bytes, 5) & 224) >> 5)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 5) & 31)));
-- Encode the entropy
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 6) & 248) >> 3));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(uuid_bytes, 6) & 7) << 2) | ((GET_BYTE(uuid_bytes, 7) & 192) >> 6)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 7) & 62) >> 1));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(uuid_bytes, 7) & 1) << 4) | ((GET_BYTE(uuid_bytes, 8) & 240) >> 4)));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(uuid_bytes, 8) & 15) << 1) | ((GET_BYTE(uuid_bytes, 9) & 128) >> 7)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 9) & 124) >> 2));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(uuid_bytes, 9) & 3) << 3) | ((GET_BYTE(uuid_bytes, 10) & 224) >> 5)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 10) & 31)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 11) & 248) >> 3));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(uuid_bytes, 11) & 7) << 2) | ((GET_BYTE(uuid_bytes, 12) & 192) >> 6)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 12) & 62) >> 1));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(uuid_bytes, 12) & 1) << 4) | ((GET_BYTE(uuid_bytes, 13) & 240) >> 4)));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(uuid_bytes, 13) & 15) << 1) | ((GET_BYTE(uuid_bytes, 14) & 128) >> 7)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 14) & 124) >> 2));
output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(uuid_bytes, 14) & 3) << 3) | ((GET_BYTE(uuid_bytes, 15) & 224) >> 5)));
output = output || CHR(GET_BYTE(encoding, (GET_BYTE(uuid_bytes, 15) & 31)));
RETURN output;
END
$$
LANGUAGE plpgsql
IMMUTABLE;
```
#### Gera 11 Digitos aleatórios: YBKXG0CKTH4
```sql
-- Cria a extensão pgcrypto para gerar uuid
CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- Cria a função para gerar ULID
CREATE OR REPLACE FUNCTION gen_lrandom()
RETURNS TEXT AS $$
DECLARE
ts_millis BIGINT;
ts_chars TEXT;
random_bytes BYTEA;
random_chars TEXT;
base32_chars TEXT := '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
i INT;
BEGIN
-- Pega o timestamp em milissegundos
ts_millis := FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000)::BIGINT;
-- Converte o timestamp para base32
ts_chars := '';
FOR i IN REVERSE 0..11 LOOP
ts_chars := ts_chars || substr(base32_chars, ((ts_millis >> (5 * i)) & 31) + 1, 1);
END LOOP;
-- Gera 10 bytes aleatórios e converte para base32
random_bytes := gen_random_bytes(10);
random_chars := '';
FOR i IN 0..9 LOOP
random_chars := random_chars || substr(base32_chars, ((get_byte(random_bytes, i) >> 3) & 31) + 1, 1);
IF i < 9 THEN
random_chars := random_chars || substr(base32_chars, (((get_byte(random_bytes, i) & 7) << 2) | (get_byte(random_bytes, i + 1) >> 6)) & 31 + 1, 1);
ELSE
random_chars := random_chars || substr(base32_chars, ((get_byte(random_bytes, i) & 7) << 2) + 1, 1);
END IF;
END LOOP;
-- Concatena o timestamp e os caracteres aleatórios
RETURN ts_chars || random_chars;
END;
$$ LANGUAGE plpgsql;
```
#### Exemplo de USO
```sql
-- Criação da extensão caso não exista
CREATE EXTENSION
IF
NOT EXISTS pgcrypto;
-- Criação da tabela pessoas
CREATE TABLE pessoas ( ID UUID DEFAULT gen_random_uuid ( ) PRIMARY KEY, nome TEXT NOT NULL );
-- Busca Pessoa na tabela
SELECT
*
FROM
"pessoas"
WHERE
uuid_to_ulid ( ID ) = '252FAC9F3V8EF80SSDK8PXW02F';
```
### Fontes
- https://github.com/scoville/pgsql-ulid
- https://github.com/geckoboard/pgulid