<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <updated>2026-10-27T11:00:37Z</updated>
  <generator>https://nostr.now</generator>

  <title>Nostr notes by linux_privacy</title>
  <author>
    <name>linux_privacy</name>
  </author>
  <link rel="self" type="application/atom+xml" href="https://nostr.now/npub1cv8cl9nfqtrkdn3k0nk05z8mjte6hxtdws6j4x65jxc06nk5tu2s4ulsnl.rss" />
  <link href="https://nostr.now/npub1cv8cl9nfqtrkdn3k0nk05z8mjte6hxtdws6j4x65jxc06nk5tu2s4ulsnl" />
  <id>https://nostr.now/npub1cv8cl9nfqtrkdn3k0nk05z8mjte6hxtdws6j4x65jxc06nk5tu2s4ulsnl</id>
  <icon>https://blossom.primal.net/3b0783e6ff4c57e9ed5886e3d58db31592c28d0c06d6aff9157fca59291d6523.webp</icon>
  <logo>https://blossom.primal.net/3b0783e6ff4c57e9ed5886e3d58db31592c28d0c06d6aff9157fca59291d6523.webp</logo>




  <entry>
    <id>https://nostr.now/nevent1qqsg5f3xvz3l0hlrqtm89p454m72236kfg8cvse43dvcu8kzeklgytgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303270xunf</id>
    
      <title type="html">Похоже я нашел новую любовь - openSUSE ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsg5f3xvz3l0hlrqtm89p454m72236kfg8cvse43dvcu8kzeklgytgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303270xunf" />
    <content type="html">
      Похоже я нашел новую любовь - openSUSE Tumbleweed #linux
    </content>
    <updated>2026-10-27T11:02:30Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs0s3jssjjx3ky4kuls35mtp0lhx9dg7lk6gjxekccn0sh2053zqpqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032c96xds</id>
    
      <title type="html">Yes</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs0s3jssjjx3ky4kuls35mtp0lhx9dg7lk6gjxekccn0sh2053zqpqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032c96xds" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsya0p6ukt6z4vx0r7jr4p43gs72vhwrxy9y75d3aeqrdq7vyqp93qjm2weh&#39;&gt;nevent1q…2weh&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Yes
    </content>
    <updated>2026-10-18T04:02:56Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqspjdm5vskl64awrk0xa2ru8nu9mydj0flehmdasxxusm3krhc7v9czyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ne0wk8</id>
    
      <title type="html">See https://www.whonix.org/wiki/Telegram</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqspjdm5vskl64awrk0xa2ru8nu9mydj0flehmdasxxusm3krhc7v9czyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ne0wk8" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvk6nwat885kz7cjm6qkgd4nrhje66q6pdun0p5xx6fk4da4zx8mqekt9al&#39;&gt;nevent1q…t9al&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;See &lt;a href=&#34;https://www.whonix.org/wiki/Telegram&#34;&gt;https://www.whonix.org/wiki/Telegram&lt;/a&gt;
    </content>
    <updated>2026-10-17T20:06:15Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvzhx2qmqa3jqaktl9ktl8wmj36363chslsgdkczlgygwxuj5wz9qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303276lhcp</id>
    
      <title type="html">:anarchy: #nevent1q…qafn</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvzhx2qmqa3jqaktl9ktl8wmj36363chslsgdkczlgygwxuj5wz9qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303276lhcp" />
    <content type="html">
      :anarchy:&lt;br/&gt;&lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nevent1qgs9t3k4tvp7cx5scactrwgx0n9aledrmqu0jkqcn254xkze46cas6sqyqqqqqze327eq8dy4ghx93tx3jhzwvlwtnsf8gz7sfzw7z8s6x2skg3qafn&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…qafn&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; У меня на белых списках работают только wss://adre.su, wss://relay.snort.social, и wss://nostr.twinkle.lol. Берите на заметку &lt;/blockquote&gt;
    </content>
    <updated>2026-10-17T18:36:15Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswgls8u5u9z9mehepp4lnplqjxjaswhv26stpnhjy4j40jupw66zqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630326cdv7h</id>
    
      <title type="html">NIP-04 NIP-17 Iris Marmot Concord Cordn Anagram ... Post-Quantum ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswgls8u5u9z9mehepp4lnplqjxjaswhv26stpnhjy4j40jupw66zqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630326cdv7h" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfymsn0e7ng5mmpkq0msgcj5v3c3dwskxcjff47nap424a5606xaqpzemhxue69uhhyetvv9ujuerfw36x7tnsw43z7udfmaj&#39;&gt;nevent1q…fmaj&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;NIP-04&lt;br/&gt;NIP-17&lt;br/&gt;Iris&lt;br/&gt;Marmot&lt;br/&gt;Concord&lt;br/&gt;Cordn&lt;br/&gt;Anagram&lt;br/&gt;...&lt;br/&gt;Post-Quantum Signal chats with Kryptos &lt;a href=&#34;https://github.com/swisslite/Kryptos&#34;&gt;https://github.com/swisslite/Kryptos&lt;/a&gt;
    </content>
    <updated>2026-10-16T13:58:26Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsxmpqpw4nnmt0z95s620uwt49gayvue9nkrqu9x49z4vcw0qcw0dqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032dnfw6d</id>
    
      <title type="html">Шах и мат аметисты #nevent1q…pqrz</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsxmpqpw4nnmt0z95s620uwt49gayvue9nkrqu9x49z4vcw0qcw0dqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032dnfw6d" />
    <content type="html">
      Шах и мат аметисты&lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nevent1qqsz8xhgv35vmw0ydgtx4q3p29n6wf0jkv83a6r0c0x86nu8jzvtfvqpzpmhxue69uhkummnw3ezumt0d5hsyg92jprny4srmtx5lq2zpy6k09e4vm0rk83q4z240degcwlyc65yfvpsgqqqqqqshepqrz&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…pqrz&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; #Amethyst v1.19.0: A New Login, Remote Signers on Android, Wayland, and Marketplace Cards&lt;br/&gt;&lt;br/&gt;Highlights:&lt;br/&gt;&lt;br/&gt;- Redesigns the **login and sign-up screens** around signers: your signer&lt;br/&gt;  app or a remote signer first, then the key field, on every platform.&lt;br/&gt;- Adds **NIP-46 remote signer login on Android**, and makes it work with&lt;br/&gt;  Opal and other signers that percent-encode their bunker addresses.&lt;br/&gt;- Opens **gift wraps in parallel** for remote-signer accounts: a cold start&lt;br/&gt;  that waited ~85s using a remote signer for DMs now takes ~20s.&lt;br/&gt;- Gives the **desktop first-class key storage**: a status card in Key&lt;br/&gt;  Backup, a password file when there is no system keyring, and an opt-out.&lt;br/&gt;- Draws **natively on Wayland** in every Linux release, with the&lt;br/&gt;  compositor&#39;s own title bar where it has one.&lt;br/&gt;- **Compresses videos on desktop** through the system&#39;s ffmpeg, with the&lt;br/&gt;  same quality table as Android.&lt;br/&gt;- Honors **relay rate limits**: a relay&#39;s `rate-limited:` back-off now holds&lt;br/&gt;  and re-sends the refused commands instead of losing them.&lt;br/&gt;- Adds cards for **NIP-15 marketplaces**, NIP-85 trust assertions, Trusted&lt;br/&gt;  Lists, decentralized lists and NIP-29 group metadata.&lt;br/&gt;&lt;br/&gt;## New Features&lt;br/&gt;&lt;br/&gt;### Login and Sign-up&lt;br/&gt;&lt;br/&gt;- Redesigns the login, sign-up and remote-signer screens on one shared frame:&lt;br/&gt;  the logo over a soft glow, rounded fields and buttons, Tor settings as a&lt;br/&gt;  chip, and a brand-and-card split on windows 840 dp and wider.&lt;br/&gt;- Shows the same order everywhere: the signer app where one is installed,&lt;br/&gt;  the remote signer wherever it works, then &#34;or&#34;, then the key field.&lt;br/&gt;- Names and draws the installed signer app (&#34;Login with Amber&#34; and its&lt;br/&gt;  icon), or says &#34;a signer app&#34; when there are several.&lt;br/&gt;- Lights up Login once a key is typed, and Create Account once there is a&lt;br/&gt;  name, and puts the terms checkbox at the top, gating every way in.&lt;br/&gt;- Puts each error right under what it is about: the key field, the password&lt;br/&gt;  field, the signer app&#39;s button or the remote signer&#39;s button.&lt;br/&gt;- Fits the logged-off screens and the remote-signer dialog on small phones,&lt;br/&gt;  and keeps the Add New Account bar above the form, not over it.&lt;br/&gt;- Uses white and frosted cards instead of grey for the login, remote-signer,&lt;br/&gt;  key-storage and Key Backup surfaces.&lt;br/&gt;&lt;br/&gt;### Remote Signers (NIP-46)&lt;br/&gt;&lt;br/&gt;- Logs in with a NIP-46 remote signer on Android too: paste a `bunker://`&lt;br/&gt;  or show the `nostrconnect://` code.&lt;br/&gt;- Hands the code to a signer app with Open signer, from an in-app menu when&lt;br/&gt;  several take it, never to Amethyst itself.&lt;br/&gt;- Shows the code in a large frame ringed by the logo&#39;s colors while it&lt;br/&gt;  waits, with Copy, Open signer and the relays as pills.&lt;br/&gt;- Lets you pick the relay your signer uses, or one of your inbox relays,&lt;br/&gt;  when it can&#39;t reach the defaults.&lt;br/&gt;- Uses relay.nip46.com, nrs.primal.net and bucket.coracle.social, the relays&lt;br/&gt;  Amber and Opal default to, instead of relay.nsec.app, which stopped&lt;br/&gt;  answering.&lt;br/&gt;- Reads percent-encoded bunker addresses, as Opal writes them, and fails&lt;br/&gt;  with an error instead of spinning forever.&lt;br/&gt;- Accepts only an answer that carries the code&#39;s secret. Anyone who saw the&lt;br/&gt;  code could reply first and pose as the signer.&lt;br/&gt;- Resends the same request on a retry, so a signer that queues requests for&lt;br/&gt;  approval (Amber) no longer asks twice.&lt;br/&gt;- Waits five minutes for the signer instead of two, and introduces each&lt;br/&gt;  platform by its own name and icon.&lt;br/&gt;- Opens gift wraps, seals and drafts up to 8 at a time ahead of the indexer.&lt;br/&gt;  With Amber over NIP-46, a desktop cold start opened its 118 wraps in&lt;br/&gt;  ~20 s instead of ~85 s.&lt;br/&gt;- Tries remote-signer accounts last when decrypting push notifications, so&lt;br/&gt;  an offline bunker no longer holds every other account&#39;s notifications.&lt;br/&gt;&lt;br/&gt;### Desktop Key Storage&lt;br/&gt;&lt;br/&gt;- Shows where your keys live in a status card at the top of Key Backup,&lt;br/&gt;  with Try again when the keychain refuses and Unlock when the key file is&lt;br/&gt;  locked.&lt;br/&gt;- Keeps keys in a password-protected NIP-49 file (`keys.ncryptsec`) when the&lt;br/&gt;  computer has no system keyring, asking for the password once per launch.&lt;br/&gt;- Adds &#34;Remember my key on this device&#34;: turn it off and the key is asked&lt;br/&gt;  for at each launch.&lt;br/&gt;- Adds Save keys to take back this run&#39;s &#34;Don&#39;t save&#34;.&lt;br/&gt;- Stops rewriting the private key to the macOS Keychain on every settings&lt;br/&gt;  save, which brought the Keychain password prompt back over and over.&lt;br/&gt;- Fixes view-only, bunker and signer-app logins failing to load after a&lt;br/&gt;  restart on Windows and Linux.&lt;br/&gt;- Fixes the Linux OS keyring in release builds (deb, rpm, AppImage and&lt;br/&gt;  Flatpak), which always fell back to the password file.&lt;br/&gt;- Treats KWallet&#39;s missing item as absent, so a fresh KWallet no longer&lt;br/&gt;  shows &#34;Keychain error&#34; on every launch.&lt;br/&gt;- Upgrades a read-only session when you Unlock, Try again or log in again&lt;br/&gt;  with the nsec.&lt;br/&gt;- Reports a key the vault could not keep once per run, instead of on every&lt;br/&gt;  settings save.&lt;br/&gt;- Keeps the `nostrconnect://` secret out of the logs.&lt;br/&gt;&lt;br/&gt;### Desktop Video Compression&lt;br/&gt;&lt;br/&gt;- Compresses videos through the system&#39;s ffmpeg at the quality slider&#39;s&lt;br/&gt;  level, with Android&#39;s resolution and bitrate table, HEVC when asked, and&lt;br/&gt;  H.264 otherwise.&lt;br/&gt;- Strips video metadata by remuxing the original when it is the one going&lt;br/&gt;  up, and asks before uploading if the strip fails.&lt;br/&gt;- Names the picked video and its target on the slider, such as&lt;br/&gt;  &#34;High · 4K video → 2160p, 8 Mbps&#34;.&lt;br/&gt;- Hides the H.265 and GIF-to-MP4 switches without ffmpeg, showing an&lt;br/&gt;  install hint instead.&lt;br/&gt;- Tells you when an encode was discarded for not being smaller.&lt;br/&gt;- Finds Homebrew and other package-manager installs of ffmpeg when the app&lt;br/&gt;  is launched from Finder.&lt;br/&gt;&lt;br/&gt;### Marketplaces (NIP-15)&lt;br/&gt;&lt;br/&gt;- Adds cards for stalls, products, marketplaces, auctions, bids and bid&lt;br/&gt;  confirmations, which showed as raw JSON or not at all.&lt;br/&gt;- Shows a product&#39;s gallery, price, stock, stall, specs and a Message&lt;br/&gt;  seller button that drafts a DM with the listing.&lt;br/&gt;- Shows an auction&#39;s starting bid, its start and end with the merchant&#39;s&lt;br/&gt;  extensions, an Upcoming/Live/Ended badge, and its highest bid and bid&lt;br/&gt;  count.&lt;br/&gt;- Reads marketplace events leniently (prices as strings, missing ids, tag&lt;br/&gt;  form auctions from hash21 and mkauction), and keeps other apps&#39; records&lt;br/&gt;  on the same kinds out.&lt;br/&gt;&lt;br/&gt;### Trust and List Cards&lt;br/&gt;&lt;br/&gt;- Adds one card for NIP-85 trusted assertions (30382-30385): what it scores,&lt;br/&gt;  the rank, hops, every other metric as a tile, timestamps as dates, and the&lt;br/&gt;  provider.&lt;br/&gt;- Shows a kind 10040&#39;s designated providers, with the services each serves.&lt;br/&gt;- Adds cards for Trusted Lists (30392-30395) with members best first and&lt;br/&gt;  their scores.&lt;br/&gt;- Adds cards for decentralized list headers and items (9998/9999,&lt;br/&gt;  39998/39999), loading a header&#39;s items while it is on screen, with `url`,&lt;br/&gt;  `tel` and `email` fields as links.&lt;br/&gt;- Adds a card for NIP-29 group metadata (39000) that opens the group.&lt;br/&gt;- Renders hashtags, links and people in bookmark lists and sets, and quotes&lt;br/&gt;  pinned notes instead of printing raw `nevent` strings.&lt;br/&gt;- Pages long rosters (3, then 50 per Show more) and caps chip rows with a&lt;br/&gt;  &#34;&#43;N more&#34; chip, since event authors decide how many tags a card gets.&lt;br/&gt;&lt;br/&gt;### Feeds and Cards&lt;br/&gt;&lt;br/&gt;- Adds an info button to each feed filter that explains what it shows, and&lt;br/&gt;  on the Notifications screen, what it does to notifications.&lt;br/&gt;- Loads the relay lists of people-list members you don&#39;t follow, so list&lt;br/&gt;  feeds, follow packs and All Follows find their notes.&lt;br/&gt;- Draws live streams with their summary, start time, viewer count, and a&lt;br/&gt;  Watch recording button over the cover once ended.&lt;br/&gt;- Shows a classified&#39;s location and a Sold badge, a zap goal&#39;s end&lt;br/&gt;  countdown, a calendar event&#39;s own time zone, and a long-form article&#39;s&lt;br/&gt;  reading time and topics.&lt;br/&gt;- Renders every kind as the thread&#39;s main note the way the feed does:&lt;br/&gt;  RSVPs, calendars, lists, chess, live activities and more drew nothing or&lt;br/&gt;  plain text there.&lt;br/&gt;- Resolves NIP-30 custom emoji on reaction notification cards, and draws an&lt;br/&gt;  untagged `:shortcode:` reaction as text instead of an empty image.&lt;br/&gt;- Plays Blossom&#39;s `.mpga` audio files and Podcasting 2.0 trailers.&lt;br/&gt;- Draws a kind 31337 as a music track only when it has a file to play, and&lt;br/&gt;  leaves the rest (ad-skip data, game state) out of the feeds.&lt;br/&gt;&lt;br/&gt;## Performance&lt;br/&gt;&lt;br/&gt;- Makes the outbox&#39;s delivery state mutable under its lock: a publish cost&lt;br/&gt;  O(relays²) in copies, ~3,400 ns per relay at 100 relays, now ~150 ns.&lt;br/&gt;- Makes a screen&#39;s subscription invalidation lock-free: 1.1 ns instead of&lt;br/&gt;  up to 8,300 ns while an update is running.&lt;br/&gt;- Returns at once when pruning frees a note that is not a zap.&lt;br/&gt;&lt;br/&gt;## Improvements and Bug fixes&lt;br/&gt;&lt;br/&gt;- Shows a relay that refused a post with a back-off as retrying while the&lt;br/&gt;  client waits it out.&lt;br/&gt;- Stops one relay&#39;s hang-up during a publish retry from reconnecting the&lt;br/&gt;  whole relay pool.&lt;br/&gt;- Fixes acks from different relays being lost, which kept an event in the&lt;br/&gt;  outbox and re-sent it on every reconnect.&lt;br/&gt;- Fixes a forged copy of a note getting the real one dropped as its&lt;br/&gt;  duplicate, and deleting an addressable&#39;s old version removing the&lt;br/&gt;  current one.&lt;br/&gt;- Downloads the Web of Trust network in ~10 s and 39 MB instead of minutes&lt;br/&gt;  and 380 MB: it no longer fetches every deletion the provider signed, and&lt;br/&gt;  learns of retracted cards over NIP-77.&lt;br/&gt;- Routes the Web of Trust provider&#39;s relays like your own: clearnet by&lt;br/&gt;  default instead of through Tor.&lt;br/&gt;- Stops a Web of Trust download on mobile data when it is not allowed,&lt;br/&gt;  keeps it through list updates, and checkpoints it so an interruption&lt;br/&gt;  loses less.&lt;br/&gt;- Fixes the zoom animation for images scrolled partly out of the feed or&lt;br/&gt;  under the bars, and makes GIFs shrink back into their thumbnail.&lt;br/&gt;- Fixes tapping a quoted reply in a chat scrolling to the wrong message.&lt;br/&gt;- Stops the like icon crossfading from an empty heart on every scroll.&lt;br/&gt;- Stops demoting the threads of audio rooms and video playback, which made&lt;br/&gt;  audio stutter under load.&lt;br/&gt;- Stops an audio room&#39;s service restarting after the app was killed and&lt;br/&gt;  holding audio focus and a wake lock for a room that was gone.&lt;br/&gt;- Stops any app from controlling picture-in-picture video playback.&lt;br/&gt;- Reads timestamps written in milliseconds as seconds, which made goals&lt;br/&gt;  and live streams end in &#34;54,000 years&#34;.&lt;br/&gt;- Keeps the Git Repositories search&#39;s `kind:git` chip out of the Namecoin&lt;br/&gt;  and `.bit` lookups.&lt;br/&gt;- Gives a room&#39;s name width before its label in Messages, so a Cordn group&lt;br/&gt;  no longer shows only its coordinator.&lt;br/&gt;- Follows the testls.space ElectrumX port swap for Namecoin.&lt;br/&gt;&lt;br/&gt;## Desktop&lt;br/&gt;&lt;br/&gt;- Draws natively on Wayland in every Linux package, with the JetBrains&lt;br/&gt;  Runtime. Set `AMETHYST_X11=1` to stay on XWayland.&lt;br/&gt;- Uses the compositor&#39;s title bar on KDE, sway, Hyprland, COSMIC and niri;&lt;br/&gt;  GNOME keeps the GTK one.&lt;br/&gt;- Fixes video playback on Windows, which said &#34;Video playback unavailable&#34;&lt;br/&gt;  in 1.18.0, and on macOS release builds.&lt;br/&gt;- Keeps the chart library intact in release builds, which ProGuard broke.&lt;br/&gt;- Lets the `.deb` install on Ubuntu 22.04, Debian 12 and their derivatives.&lt;br/&gt;- Fixes `.deb` and `.rpm` installs and removals failing on systems without&lt;br/&gt;  `/usr/share/desktop-directories`, and upgrades that removed the menu&lt;br/&gt;  entry.&lt;br/&gt;- Requires the system libraries and a font in the `.rpm`, so minimal Fedora&lt;br/&gt;  and openSUSE installs launch.&lt;br/&gt;- Renames the Flatpak app ID to `com.vitorpamplona.amethyst.Amethyst`, so it&lt;br/&gt;  doesn&#39;t share the Android package&#39;s listing in Nostr app stores. See&lt;br/&gt;  `BUILDING.md` to move your v1.18.0 data.&lt;br/&gt;- Fixes the Web of Trust download, which never started on desktop, and&lt;br/&gt;  keeps Cordn&#39;s group state on disk.&lt;br/&gt;- Drops the image viewer&#39;s URL tooltip and click-to-copy; Copy URL stays in&lt;br/&gt;  its menu.&lt;br/&gt;- Removes the Intel macOS options from the README: only Apple Silicon is&lt;br/&gt;  built.&lt;br/&gt;&lt;br/&gt;## Cli&lt;br/&gt;&lt;br/&gt;- Fixes `amy` 1.18.0&#39;s self-contained bundles crashing on every command with&lt;br/&gt;  `NoClassDefFoundError: java/lang/management/ManagementFactory`.&lt;br/&gt;- Lists relays `amy fetch --paginate` could not page under `unpaged_relays`,&lt;br/&gt;  and warns that the result may be partial.&lt;br/&gt;- Adds `retry_after_ms` to `rejected_by` entries.&lt;br/&gt;- Fetches all of a search such as `include:spam` on search.brainstorm.world:&lt;br/&gt;  `amy fetch` returned 5,000 of 35,578 events, and `amy sync` none.&lt;br/&gt;&lt;br/&gt;## Quartz&lt;br/&gt;&lt;br/&gt;- Implements NIP-01 rate-limit back-offs (nostr-protocol/nips#2498):&lt;br/&gt;  `OkMessage` and `ClosedMessage` carry `params` and `retryAfterMs`.&lt;br/&gt;- Holds a relay&#39;s refused commands on its connection (`RateLimitGate`) and&lt;br/&gt;  re-sends them when the back-off passes, across reconnects and pool&lt;br/&gt;  changes, with the subscription&#39;s current filters.&lt;br/&gt;- Adds `RateLimiter` and `RateLimitPolicy` for relays, with&lt;br/&gt;  `PolicyResult.Rejected.rateLimited`.&lt;br/&gt;- Pages a NIP-50 search with no words to rank, keeps `observer:` searches on&lt;br/&gt;  one page, and carries the search on `fetchByIds`.&lt;br/&gt;- Re-asks a page cut short inside its boundary second instead of reporting&lt;br/&gt;  DRAINED.&lt;br/&gt;- Fixes a decoder hang on short OK, CLOSED and NEG-ERR frames, a truncated&lt;br/&gt;  JSON object looping, and a field like `jE` replacing an event&#39;s `id`.&lt;br/&gt;- Fixes `subscribeAsFlow` and `fetchAsFlow` dropping the newest list on a&lt;br/&gt;  burst.&lt;br/&gt;- Fixes `QuicReader` overflowing on a peer-chosen length, and a bad datagram&lt;br/&gt;  escaping to the crash handler.&lt;br/&gt;- Reads NIP-15 marketplace events leniently, with `isWellFormed()`,&lt;br/&gt;  `AuctionData.endsAt()` and `AuctionBidSummary`.&lt;br/&gt;- Adds `AssertionMetric` readers, Trusted List accessors and D-list&lt;br/&gt;  `fieldDeclarations()`, `displayHints()` and `listImage()`, with `tel` and&lt;br/&gt;  `email` field types.&lt;br/&gt;- Adds `TimeUtils.toUnixSeconds` for millisecond timestamps.&lt;br/&gt;- `EmojiUrlTag.decode` returns null unless both shortcode and url are present.&lt;br/&gt;&lt;br/&gt;## Geode&lt;br/&gt;&lt;br/&gt;- Adds a `[rate_limits]` section for events and REQs per client per minute,&lt;br/&gt;  answering with the NIP-01 back-off and 429 with `Retry-After` over NIP-FE.&lt;br/&gt;  Off by default.&lt;br/&gt;- Counts an IPv6 client by its /64.&lt;br/&gt;- Caps WebSocket frames at 1 MiB by default; one header could cost 2 GB.&lt;br/&gt;&lt;br/&gt;## Build &amp; Documentation&lt;br/&gt;&lt;br/&gt;- Fails the desktop release if ProGuard strips a JNI native method, a&lt;br/&gt;  D-Bus transport or leaves a stale jar signature.&lt;br/&gt;- Fails the `amy` build when its runtime lacks a JDK module its jars use.&lt;br/&gt;- Self-tests the OS keyring on every packaged desktop build in CI.&lt;br/&gt;- Speeds up `.deb` post-processing from 156 s to 51 s.&lt;br/&gt;- Splits the iOS CI jobs and caches the Kotlin/Native toolchain, so they&lt;br/&gt;  finish under their timeout.&lt;br/&gt;- Adds `tools/desktop-run` to run and screenshot the shared UI headless, and&lt;br/&gt;  asks agents to look at a UI change before calling it done.&lt;br/&gt;- Clears the build and lint warnings across modules, and removes 125 unused&lt;br/&gt;  Android strings and 10 unused drawables.&lt;br/&gt;- Publishes the Flatpak to Orchard.&lt;br/&gt;- States that issue bounties are not a promise of payment.&lt;br/&gt;&lt;br/&gt;## Contributors&lt;br/&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsyvrp9u6p0mfur9dfdru3d853tx9mdjuhkphxuxgfwmryja7zsvhqpzamhxue69uhhv6t5daezumn0wd68yvfwvdhk6tcpzpmhxue69uhkummnw3ezumt0d5hszythwden5te0dehhxarj9emkjmn99uwfvhl6&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;VitorPamplona&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…vhl6&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wdjkuerfwshxummnvekxzun99e3k7mf0qythwumn8ghj7un9d3shjtnswf5k6ctv9ehx2ap028kcfw&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;⚡ Dee Kay ⚡&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…kcfw&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsyxxz7mm9kwkyjsf935da90ulyqlaautk6wgq68q5m3n6t5lzmfuqpz9mhxue69uhkummnw3ezuamfdejj7qg4waehxw309aex2mrp0yhxgctdw4eju6t09uqsuamnwvaz7tmwdaejumr0dshsqfznmg&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;mstrofnone&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…znmg&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;## Translations&lt;br/&gt;&lt;br/&gt;- Czech, German, Swedish, and Brazilian Portuguese by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wdjkuerfwshxummnvekxzun99e3k7mf0qythwumn8ghj7un9d3shjtnswf5k6ctv9ehx2ap028kcfw&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;⚡ Dee Kay ⚡&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…kcfw&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Hindi by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs88dt78wgnzvaph6fcstfvsd98xc2qs8eg8tllwv2zlutu8ehec2cppemhxue69uhkummn9ekx7mp0qythwumn8ghj7un9d3shjtnswf5k6ctv9ehx2ap0qyt8wumn8ghj7un9d3shjtnyd968gmewwp6kytcmlz0lu&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;राज&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…z0lu&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Hungarian by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsxekg0s8kxpcrka8ccwztv2m73kz6jy0ur8f7jc04rwr5p44w5acspzamhxue69uhhyetvv9ujumn0wd68ytnzv9hxgtcppemhxue69uhkummn9ekx7mp0qyg8wumn8ghj7mn0wd68ytnddakj7c0ns2l&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;summoner&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…ns2l&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Polish by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsdyfz0ewdhmgp3a4r3pxvezx5r8yalrgvjn38v2ml5qrusnv7yywgpzemhxue69uhkummnw3ezucm6v9ejuurvw4ej7qg0waehxw309a3h5ctn9e6x7up0qyg8wumn8ghj7cm6v9ejuurvw4ej79s8c53&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Polak&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…8c53&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; &lt;/blockquote&gt;
    </content>
    <updated>2026-10-14T16:20:59Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszfrry9vzasv8uqrzmpn8wfds7x6x2n0pqf6n47gcjehw06l8lm4gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032lr00g5</id>
    
      <title type="html">About telegram: https://www.whonix.org/wiki/Telegram ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszfrry9vzasv8uqrzmpn8wfds7x6x2n0pqf6n47gcjehw06l8lm4gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032lr00g5" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsy0sl6krv4866fmk9xuqsvldx5094ml2grmhtjvgdx4vd3mx33jnqpzamhxue69uhhsmtj9e6hxetwdaehgu3wdaexwtcemy3md&#39;&gt;nevent1q…y3md&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;About telegram:&lt;br/&gt;&lt;a href=&#34;https://www.whonix.org/wiki/Telegram&#34;&gt;https://www.whonix.org/wiki/Telegram&lt;/a&gt;&lt;br/&gt;&lt;a href=&#34;https://rys.io/en/179.html&#34;&gt;https://rys.io/en/179.html&lt;/a&gt;
    </content>
    <updated>2026-10-14T03:43:07Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsr9cung25aqkcwqemsnfkquxt8fsxltm4945695gfrww3snfqywkqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630329hdksc</id>
    
      <title type="html">Do you like it when your messages can be read on the server? Do ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsr9cung25aqkcwqemsnfkquxt8fsxltm4945695gfrww3snfqywkqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630329hdksc" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsy7ksaz8vnl9rtyu42wvv29jvmkchtuv2u0uae0u4gchlrga6dl6qpzamhxue69uhhyetvv9ujuurjd9kkzmpwdejhgtcjwkpmz&#39;&gt;nevent1q…kpmz&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Do you like it when your messages can be read on the server? Do you like having Google services built into Telegram? Do you like it when your internet provider can track you through an unencrypted id?
    </content>
    <updated>2026-10-14T03:40:33Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs0253w80ffqs8q07wf58ds5xxa2hsl4jxl82hapsznz4u2jq34j8gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032mu0kg4</id>
    
      <title type="html">Signal encryption without servers, phone number, email and login. ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs0253w80ffqs8q07wf58ds5xxa2hsl4jxl82hapsznz4u2jq34j8gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032mu0kg4" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsy0mmp3yz43qj4s8wvalx3dk3m5r746phyx6tt6l4gluh452es70s28pz4x&#39;&gt;nevent1q…pz4x&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Signal encryption without servers, phone number, email and login. This keyboard works perfectly with White Noise and all nostr apps.&lt;br/&gt;&lt;a href=&#34;https://github.com/swisslite/Kryptos&#34;&gt;https://github.com/swisslite/Kryptos&lt;/a&gt;
    </content>
    <updated>2026-10-10T04:40:15Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqstegq4dppnc9jj8exqljcdgrataxlshh3tv0nlxzhdm2eq8jlsuhgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ydg3j7</id>
    
      <title type="html">New 0xChat Release!! ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqstegq4dppnc9jj8exqljcdgrataxlshh3tv0nlxzhdm2eq8jlsuhgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ydg3j7" />
    <content type="html">
      New 0xChat Release!! &lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/0xchat-app/0xchat-app-main/releases&#34;&gt;https://github.com/0xchat-app/0xchat-app-main/releases&lt;/a&gt;
    </content>
    <updated>2026-10-01T15:53:09Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsdeluwe86w7xk3qq6tg5ztangll7a5tqq9rdmj58n4aegk0ekdrfgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630329k8nud</id>
    
      <title type="html">@nprofile…8v88 очень крут, большой ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsdeluwe86w7xk3qq6tg5ztangll7a5tqq9rdmj58n4aegk0ekdrfgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630329k8nud" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs0yu6p7m83u74alz2rwgjxxvh43lneexf96jyluktjrqqhx99dl5cppemhxue69uhkummn9ekx7mp0qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgswaehxw309ahx7um5wghx6mmd9use8v88&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;nostrich&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…8v88&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; очень крут, большой потенциал. Рекомендую следить за обновлениями
    </content>
    <updated>2026-09-24T21:28:19Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrt7v57w8cu83q5kmhkv9qfhlg0kuwet2mschu4afj3v55jr05v3szyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032c3hck2</id>
    
      <title type="html">Новый потенциально очень крутой ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrt7v57w8cu83q5kmhkv9qfhlg0kuwet2mschu4afj3v55jr05v3szyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032c3hck2" />
    <content type="html">
      Новый потенциально очень крутой клиент Nostr. Пока у него идет активная разработка, атакуйте пожеланиями в комментариях: просите нормальный переводчик, стабильные уведомления, приватные подписки, музыку, видео и тд. Не скромничайте.&lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nevent1qqszc2zhj2xt5dfyfwygjgmg9swprksjfee37hpvj5wtk8erm5pfmkqpzemhxue69uhhyetvv9ujuerfw36x7tnsw43z7q3q7fe5rak0reatm7y5xu3yvve0trl8njvjt4yflevhyxqpwv22mlfsxpqqqqqqzum2aqe&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…2aqe&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; Nostrich is a new, 100% free, and best-in-class Nostr client for web, iOS, Android &amp; Mac. We’re web-only right now but native apps are launching soon. Your content. Your feed. Your experience.&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://nostrich.org&#34;&gt;https://nostrich.org&lt;/a&gt; &lt;/blockquote&gt;
    </content>
    <updated>2026-09-23T04:59:22Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyck5ef4dy7m0j09hfueer6pe7dw5t626dw5sc64hvvfx9sj0h4wszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032mp7f57</id>
    
      <title type="html">## Супер обновление Kryptos! Клавиатура ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyck5ef4dy7m0j09hfueer6pe7dw5t626dw5sc64hvvfx9sj0h4wszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032mp7f57" />
    <content type="html">
      ## Супер обновление Kryptos! &lt;br/&gt;&lt;br/&gt;Клавиатура стала офигенно удобной и теперь можно делать бэкап чатов - переписка не потеряется при покупке нового телефона! Качайте, обновляйте и общайтесь с шифрованием Signal везде: в любых мессенджерах, соцсетях, в nostr и даже по смс. #privacy #security #signal #encryption&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/swisslite/Kryptos&#34;&gt;https://github.com/swisslite/Kryptos&lt;/a&gt;
    </content>
    <updated>2026-09-21T06:35:54Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8l9ncu0z3yg7xqn776ltr5h7hvgtnlnu8phrgm3qx3t49wnr5lyczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032z9arel</id>
    
      <title type="html">Круто, когда приложуха постоянно ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8l9ncu0z3yg7xqn776ltr5h7hvgtnlnu8phrgm3qx3t49wnr5lyczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032z9arel" />
    <content type="html">
      Круто, когда приложуха постоянно развивается&lt;br/&gt;&lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nevent1qqs00y2w0flzjwvgfp2rn6etag5up8pc342vg5ky5x0cncgxm0ced8spzpmhxue69uhkummnw3ezumt0d5hsyg92jprny4srmtx5lq2zpy6k09e4vm0rk83q4z240degcwlyc65yfvpsgqqqqqqsec7259&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…7259&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; #Amethyst v1.16.0: My Fitness, BOLT12 Payments, and a Leaner Core&lt;br/&gt;&lt;br/&gt;Highlights:&lt;br/&gt;&lt;br/&gt;- Adds **My Fitness**, a dashboard over everything you have trained.&lt;br/&gt;- Moves **BOLT12 offers** into the profile payment rail, and zaps over BOLT11&lt;br/&gt;  when a wallet refuses one.&lt;br/&gt;- Opens the **zapped note** from wallet history.&lt;br/&gt;- Fixes **Blossom uploads**, broken on most servers since 1.15.0.&lt;br/&gt;- Takes **~40 MB off every `amy` distribution**.&lt;br/&gt;- Stops counting a relay that hung up as connected.&lt;br/&gt;- Updates **Arti to 2.6.0** for two medium-severity fixes.&lt;br/&gt;&lt;br/&gt;## New Features&lt;br/&gt;&lt;br/&gt;### My Fitness&lt;br/&gt;&lt;br/&gt;- Adds a training dashboard, reached from the drawer or a pinned bottom-bar slot.&lt;br/&gt;- Builds it from both sources: Health Connect, and the kind 1301 workouts you&lt;br/&gt;  published. Neither is required.&lt;br/&gt;- Summarises four weeks: this week against last, weekly averages, a breakdown by&lt;br/&gt;  activity, best efforts, active days and a day streak.&lt;br/&gt;- Shows distance, calories, steps, climb and heart rate only when a workout&lt;br/&gt;  carries them.&lt;br/&gt;- Offers to share a workout only when it is not already published.&lt;br/&gt;- Prefers the Health Connect copy when the same effort appears in both sources —&lt;br/&gt;  it carries the heart rate, steps and climb the published event drops.&lt;br/&gt;- Filters the Workouts feed by **Mine** from the top nav.&lt;br/&gt;- Reads workouts in the POWR dialect, which carry `start`/`end` and no `duration`.&lt;br/&gt;&lt;br/&gt;### Payments&lt;br/&gt;&lt;br/&gt;- Renders each BOLT12 offer as a chip in the profile payment rail. Offers were&lt;br/&gt;  already payable, but only through a small button in the profile header.&lt;br/&gt;- Removes both header wallet buttons. The rail lists everything they reached.&lt;br/&gt;- Shows the zap bolt to recipients who publish an offer and no lightning address.&lt;br/&gt;  The send path already paid them; the picker just never offered it.&lt;br/&gt;- Falls back to a BOLT11 zap when a wallet refuses an offer and the recipient also&lt;br/&gt;  publishes a lightning address.&lt;br/&gt;- Retries only refusals that mean nothing was attempted. A `PAYMENT_FAILED` can&lt;br/&gt;  still settle later, so retrying it could pay twice.&lt;br/&gt;- Reports a timeout when a wallet never answers, instead of hanging the zap.&lt;br/&gt;- Opens the zapped note when you tap a zap in wallet history.&lt;br/&gt;&lt;br/&gt;## Performance&lt;br/&gt;&lt;br/&gt;- Stops emptying the media connection pool on every client rebuild. Both HTTP&lt;br/&gt;  clients share one pool, so the proxy check misread every rebuild as a route&lt;br/&gt;  change.&lt;br/&gt;- Drops pooled connections once per real Tor route change instead.&lt;br/&gt;- Stops `debugState()` walking the whole cache on every backgrounding. Its nine&lt;br/&gt;  scans were built eagerly and then discarded unread.&lt;br/&gt;- Signs one Blossom read-auth token per server, not one per racing caller.&lt;br/&gt;&lt;br/&gt;## Improvements and Bug fixes&lt;br/&gt;&lt;br/&gt;- Sends the Blossom authorization token as standard padded Base64 again. Deployed&lt;br/&gt;  servers reject 1.15.0&#39;s unpadded base64url, so roughly two uploads in three&lt;br/&gt;  failed.&lt;br/&gt;- Points the Sovbit default Blossom server at `files.sovbit.host`.&lt;br/&gt;- Answers a relay&#39;s WebSocket CLOSE frame, in both the shared and the Android&lt;br/&gt;  socket. Without it a closed socket looked connected for up to four minutes,&lt;br/&gt;  silently discarding everything sent.&lt;br/&gt;- Counts connected relays from the pool&#39;s connected flow, which the pool now&lt;br/&gt;  clears itself whenever it drops a relay.&lt;br/&gt;- Renders a GIF with no `imeta` as a loading placeholder. It used to collapse the&lt;br/&gt;  whole note to a gap in the feed until the fetch finished.&lt;br/&gt;- Drains the event-sync outbox before closing the client. Events from the final&lt;br/&gt;  page were reported Done and never delivered.&lt;br/&gt;- Fixes 34 bugs found auditing `commons` and `commonsUI`. Among them: AES-GCM&lt;br/&gt;  initialised with a spec every JDK rejects; an `Onion-Location` header from any&lt;br/&gt;  host re-pointing Tor traffic for 24 hours; a bundled insert wedged after one&lt;br/&gt;  exception; a URL validator backtracking exponentially per keystroke.&lt;br/&gt;- Uses `https` in preview data and image-URL placeholders.&lt;br/&gt;&lt;br/&gt;## Desktop&lt;br/&gt;&lt;br/&gt;- Stops a silent account wipe on macOS. One Deny on the Keychain prompt rotated&lt;br/&gt;  the encryption key and orphaned every saved account.&lt;br/&gt;- Consolidates the keychain into a single `vault-v1` item, so a cold boot prompts&lt;br/&gt;  once.&lt;br/&gt;- Allows first-launch key bootstrap on Linux and Windows.&lt;br/&gt;&lt;br/&gt;## Cli&lt;br/&gt;&lt;br/&gt;- Ships ~40 MB lighter, now that `amy` no longer drags Compose UI and Skiko behind&lt;br/&gt;  `commons`.&lt;br/&gt;- Fails fast when a buzz-agent wrapper cannot be made executable.&lt;br/&gt;&lt;br/&gt;## Quartz&lt;br/&gt;&lt;br/&gt;- Answers a duplicate `EVENT` with `OK true`, per NIP-01, and a superseded&lt;br/&gt;  replaceable the same way. Clients used to get raw SQLite text they could not&lt;br/&gt;  classify, and retried forever.&lt;br/&gt;- Gives each socket adapter its own session, removing the pool&#39;s locking and&lt;br/&gt;  identity checks.&lt;br/&gt;&lt;br/&gt;## Build &amp; Documentation&lt;br/&gt;&lt;br/&gt;- Updates Arti 2.3.0 → 2.6.0, the JNI crate to 0.22, the NDK to r30 and Rust to&lt;br/&gt;  1.98.1. Picks up TROVE-2026-24 and TROVE-2026-27, both reachable in normal use.&lt;br/&gt;- Splits Compose UI out of `commons` into a new `commonsUI` module. 236 files&lt;br/&gt;  moved and no consumer import changed.&lt;br/&gt;- Bumps LightCompressor-enhanced to 2.2.3.&lt;br/&gt;- Drops the unused Guardian Project Maven repository.&lt;br/&gt;- Runs relay-backed tests against geode instead of external relays.&lt;br/&gt;- Clears the compiler, Android Lint and Gradle 10 deprecation warnings.&lt;br/&gt;- Bumps `appCode` to 461.&lt;br/&gt;&lt;br/&gt;## Contributors&lt;br/&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsyvrp9u6p0mfur9dfdru3d853tx9mdjuhkphxuxgfwmryja7zsvhqpzamhxue69uhhv6t5daezumn0wd68yvfwvdhk6tcpzpmhxue69uhkummnw3ezumt0d5hszythwden5te0dehhxarj9emkjmn99uwfvhl6&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;VitorPamplona&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…vhl6&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;⚡ Dee Kay ⚡&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…m3sx&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- mstrofnone&lt;br/&gt;&lt;br/&gt;## Translations&lt;br/&gt;&lt;br/&gt;- Polish by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsdyfz0ewdhmgp3a4r3pxvezx5r8yalrgvjn38v2ml5qrusnv7yywgpzemhxue69uhkummnw3ezucm6v9ejuurvw4ej7qg0waehxw309a3h5ctn9e6x7up0qyg8wumn8ghj7cm6v9ejuurvw4ej79s8c53&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Polak&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…8c53&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Hindi by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs88dt78wgnzvaph6fcstfvsd98xc2qs8eg8tllwv2zlutu8ehec2cppemhxue69uhkummn9ekx7mp0qythwumn8ghj7un9d3shjtnswf5k6ctv9ehx2ap0qyt8wumn8ghj7un9d3shjtnyd968gmewwp6kytcmlz0lu&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;राज&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…z0lu&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Hungarian by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsxekg0s8kxpcrka8ccwztv2m73kz6jy0ur8f7jc04rwr5p44w5acspzamhxue69uhhyetvv9ujumn0wd68ytnzv9hxgtcppemhxue69uhkummn9ekx7mp0qyg8wumn8ghj7mn0wd68ytnddakj7c0ns2l&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;summoner&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…ns2l&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; &lt;/blockquote&gt;
    </content>
    <updated>2026-09-17T19:51:52Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsf4spyaw4ckx7qvvagw0g4t52mrldf5nfyuxasnz75cq78feym5nszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303257mw9g</id>
    
      <title type="html">Крутая штука #ai ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsf4spyaw4ckx7qvvagw0g4t52mrldf5nfyuxasnz75cq78feym5nszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303257mw9g" />
    <content type="html">
      Крутая штука #ai&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://zapstore.dev/apps/naddr1qqykz6fwdeuk6cn0wsq3samnwvaz7tmjv4kxz7fw0fshqum5daex2tnyv4mqygx5n2gz8gsahgdneqcxegmfhuey8k95fw8skmg3jes877cfjragmupsgqqq0c9s9k0jdp&#34;&gt;https://zapstore.dev/apps/naddr1qqykz6fwdeuk6cn0wsq3samnwvaz7tmjv4kxz7fw0fshqum5daex2tnyv4mqygx5n2gz8gsahgdneqcxegmfhuey8k95fw8skmg3jes877cfjragmupsgqqq0c9s9k0jdp&lt;/a&gt;
    </content>
    <updated>2026-09-12T14:01:50Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2zhx52j2ag2uf228mjjwe93g6ll99vtm7ltzrss90e5hya8lqnngzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032xfrumz</id>
    
      <title type="html">Please add Follow Lists with private following, like in Amethyst</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2zhx52j2ag2uf228mjjwe93g6ll99vtm7ltzrss90e5hya8lqnngzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032xfrumz" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs2696zvgxkx2ddmjq9spp3gnsnt2fg2dfrcjgged0r2yysrvd5cccpzpmhxue69uhkummnw3ezumt0d5hse85gm3&#39;&gt;nevent1q…5gm3&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Please add Follow Lists with private following, like in Amethyst
    </content>
    <updated>2026-09-07T05:12:32Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsxmy22r7jwy3ftyjyg6g33y485x5lqhq88qzv6day8jekxga0s48szyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032lygpgj</id>
    
      <title type="html">@nprofile…c34r When will you add private lists for hidden ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsxmy22r7jwy3ftyjyg6g33y485x5lqhq88qzv6day8jekxga0s48szyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032lygpgj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsw35ekse8402ugtz42uffgj07gk7p3gaxzfwl74q8dy5f9n3mnnwgpzpmhxue69uhkummnw3ezumt0d5hset6k7v&#39;&gt;nevent1q…6k7v&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs0f6uwv2kazdqtnjkumxrpue5m96g8e6jnfc8h7wkfwnq3cav22xspz4mhxue69uhhyetvv9ujuerpd46hxtnfduhszrnhwden5te0dehhxtnvdakz7qgswaehxw309ahx7um5wghx6mmd9u34c34r&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Jumble&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…c34r&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  When will you add private lists for hidden subscriptions (as in amethyst and wisp)?
    </content>
    <updated>2026-09-04T15:34:08Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2gz0gumr37ex8zre82s3s3xcgy9df77jjuzqah693a0kwxt07l0szyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303228l9av</id>
    
      <title type="html">By the way, this keyboard will protect against chat-control ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2gz0gumr37ex8zre82s3s3xcgy9df77jjuzqah693a0kwxt07l0szyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303228l9av" />
    <content type="html">
      By the way, this keyboard will protect against chat-control #chat-control&lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nevent1qqs8gd2uexwpavsn4y3kchr2vr49jnpw8e9z6hu60e0mpxzvrxk48gspzpmhxue69uhkummnw3ezumt0d5hsygxrp78ev6gzcanvudnuanaq37uj7w4ejmt5x54fk4y3kr75a4zlz5psgqqqqqqsemve7l&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…ve7l&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; Супер-клавиатура kryptos с шифрованием signal и стеганографией обновилась и стала еще круче! И кнопки стали больше - удобно быстро печатать. Качайте себе и друзьям на случай тотального чебурнета&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/swisslite/Kryptos&#34;&gt;https://github.com/swisslite/Kryptos&lt;/a&gt; &lt;/blockquote&gt;
    </content>
    <updated>2026-09-03T18:55:44Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8sc2zr2enjxckpwwmg0z3r0277kwz79kalen5ffnt7pxyadkk7mszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032fe87u9</id>
    
      <title type="html">Maybe you could add a browser for nostr web clients, with ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8sc2zr2enjxckpwwmg0z3r0277kwz79kalen5ffnt7pxyadkk7mszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032fe87u9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsp4wec3lu6q37k5j4la09ydgmjrj7xg45x3l2832erkh4qa4s9gmcpzpmhxue69uhkummnw3ezumt0d5hs2kfddp&#39;&gt;nevent1q…fddp&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Maybe you could add a browser for nostr web clients, with clearing of cookies and history? Users could chats safely on Vector and use nostr as a social network.
    </content>
    <updated>2026-09-03T15:20:30Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8gd2uexwpavsn4y3kchr2vr49jnpw8e9z6hu60e0mpxzvrxk48gszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303242s3tc</id>
    
      <title type="html">Супер-клавиатура kryptos с шифрованием ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8gd2uexwpavsn4y3kchr2vr49jnpw8e9z6hu60e0mpxzvrxk48gszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303242s3tc" />
    <content type="html">
      Супер-клавиатура kryptos с шифрованием signal и стеганографией обновилась и стала еще круче! И кнопки стали больше - удобно быстро печатать. Качайте себе и друзьям на случай тотального чебурнета&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/swisslite/Kryptos&#34;&gt;https://github.com/swisslite/Kryptos&lt;/a&gt;
    </content>
    <updated>2026-09-03T13:02:30Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8nak9qnmw3c6p2xlxhc2kz7yr297chlly0yldeezzmt7cy8xxcqqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630329qw9ah</id>
    
      <title type="html">@nprofile…wywf sets high standards for #nostr, and I love it. ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8nak9qnmw3c6p2xlxhc2kz7yr297chlly0yldeezzmt7cy8xxcqqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630329qw9ah" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs24yz8xftq8kkdf7q5yzf4v7tn2ek78v0zp2y427mj3sa7f34ggjcpzamhxue69uhhv6t5daezumn0wd68yvfwvdhk6tcpzpmhxue69uhkummnw3ezumt0d5hszrnhwden5te0dehhxtnvdakz769wywf&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;amethyst&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…wywf&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; sets high standards for #nostr, and I love it. Nostr is no longer just Twitter — it’s a powerful social network. Other clients should take inspiration from Amethyst, otherwise, users will end up with a basic Twitter without cool features like calls, podcasts, music, browser, private lists, and more. Another client with high standards is Ditto. And it’s great that we can now use Ditto directly in Amethyst through the built-in browser.
    </content>
    <updated>2026-09-03T06:10:23Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswjadh3k5gldltc4q42267q5nvjktjyhdl8rufdsngktzqahr6rmqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630320anhrp</id>
    
      <title type="html">Проект выглядит интересно. Следим и ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswjadh3k5gldltc4q42267q5nvjktjyhdl8rufdsngktzqahr6rmqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630320anhrp" />
    <content type="html">
      Проект выглядит интересно. Следим и просим разраба добавить крутые функций, пока у него энтузиазма море&lt;br/&gt;&lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nevent1qqswfdrz24cm5k3uedcwdw55lrkp5xd24llq3emzjam7gnepns7g7ygppemhxue69uhkummn9ekx7mp0qgsxfrq02vpvwhec8q4y6ty95jptjf7vvxeg9zs8jn3kcmx8jm0gdfsrqsqqqqqpt6kd0p&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…kd0p&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; LibreNostr 0.1.5 is out.&lt;br/&gt;&lt;br/&gt;Feeds, notifications and DMs were losing events past ~4 relays: the socket flow was unbuffered, so one slow collector blocked every relay behind it, and queries finished on the first EOSE. Buffered now, and a query waits for a quorum instead of a winner.&lt;br/&gt;&lt;br/&gt;Follow/unfollow bots (HiveMind, Tzongocu, Football whateverwasitsname) were flooding notifications. Not a spam problem — a key problem: a kind 3 list is republished in full on every change, so each cycle carries a new event id, and rows were keyed by event id. One account, seven identical rows in a minute. Follows are keyed by who and what day now.&lt;br/&gt;&lt;br/&gt;Plus: notifications and DMs fetched at session start, old DMs backfilled, an undo countdown before a note goes out, and a relay list rebuilt by probing instead of by reputation.&lt;br/&gt;&lt;br/&gt;Get the new release on &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub10r8xl2njyepcw2zwv3a6dyufj4e4ajx86hz6v4ehu4gnpupxxp7stjt2p8&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Zapstore&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub10r8…t2p8&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; as usual&lt;br/&gt;or from github: &lt;br/&gt;&lt;a href=&#34;https://github.com/Lwb89dev/librenostr/releases/tag/v0.1.5&#34;&gt;https://github.com/Lwb89dev/librenostr/releases/tag/v0.1.5&lt;/a&gt; &lt;/blockquote&gt;
    </content>
    <updated>2026-09-01T20:31:44Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsfpl7cut3378dmzsgczjsndc8jt7q3x8lenycddhpu23zytsrfd0qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032t8n7zg</id>
    
      <title type="html">Свежак для любителей антидетек ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsfpl7cut3378dmzsgczjsndc8jt7q3x8lenycddhpu23zytsrfd0qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032t8n7zg" />
    <content type="html">
      Свежак для любителей антидетек браузеров&lt;br/&gt;#privacy #anti-detect #antidetect&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/nullnullseven/camoufox-gui-center&#34;&gt;https://github.com/nullnullseven/camoufox-gui-center&lt;/a&gt;
    </content>
    <updated>2026-08-24T19:40:31Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswdp77zsfnytlppgpvfa5z6qa6lluve3xs4d6zeec69wprqaugl7qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032d337mf</id>
    
      <title type="html">Он примерно раз в месяц делает ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswdp77zsfnytlppgpvfa5z6qa6lluve3xs4d6zeec69wprqaugl7qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032d337mf" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsyyf88w829xl7e7dg30qc6f8ws3uwp3dl2u99x4tx4mql4t5pf35spr4mhxue69uhkummnw3ez6vp39eukz6mfdphkumn99e3k7mf0vu6pn8&#39;&gt;nevent1q…6pn8&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Он примерно раз в месяц делает новые статьи.
    </content>
    <updated>2026-08-23T05:11:14Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsz48wwzsuxyurh3crzjusfvfjv036n8h284uhnqa9nwyefc5pn5gszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032dht9zl</id>
    
      <title type="html">Уже прошла четвертая атака. Никогда ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsz48wwzsuxyurh3crzjusfvfjv036n8h284uhnqa9nwyefc5pn5gszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032dht9zl" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs8kpcazp37rk8n85gxfxg2rqcntw9dyke2apmugrwjc0nrr0hclhcppemhxue69uhkummn9ekx7mp0cjn7q4&#39;&gt;nevent1q…n7q4&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Уже прошла четвертая атака. Никогда не ленитесь увеличивать энтропию и проверяйте ее при выборе кошелька &#43; добавляйте 25 слово. Сейчас лучший вариант - создать новый кошелёк на старом оффлайн телефоне с помощью Airgap Vault и отправить всё туда. Можно купить старый дешевый pixel 3a, установить туда линукс Droidian (очень легко устанавливается), и затем в нем запустить overlayfs в tmpfs или в эфемерно-зашифрованном контейнере, затем запустить Waydroid, который не сохранит никаких следов на диске после перезагрузки, поставить туда Airgap Vault и вырубить интернет, создать кошелек, сохранить адрес и сид фразу, и перезагрузиться. Итого, кошелек будет создан безопасно &#43; на телефоне об этом не останется никаких следов и никакая криминалистическая экспертиза не сможет получить данные о кошельке.
    </content>
    <updated>2026-08-03T04:44:29Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs9nqmrkx6xe7qh97l0zk6uzfa4ght5eukgrcaw9ptydrprhw0g4qszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ravnqh</id>
    
      <title type="html">Там блочат всё, что можно, чего даже ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs9nqmrkx6xe7qh97l0zk6uzfa4ght5eukgrcaw9ptydrprhw0g4qszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ravnqh" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrkvdzemkl24plhvf30v9cqse5uvsdgwgzy7rvyk0uunpmf3p4rzspz4mhxue69uhhyetvv9ujuerpd46hxtnfduhsyk5acu&#39;&gt;nevent1q…5acu&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Там блочат всё, что можно, чего даже официально нет в списках запрещенки. Поэтому надо подбирать реле, чтоб всё работало норм. Популярные реле могут вообще не работать во многих регионах.
    </content>
    <updated>2026-08-01T20:30:55Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvneu62s886rvj6ymqkajh6v52dq8dupcyn2n3an5yj8j4gpl78rqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630322t9ym2</id>
    
      <title type="html">Amethyst бомба! #nevent1q…7mhj</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvneu62s886rvj6ymqkajh6v52dq8dupcyn2n3an5yj8j4gpl78rqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630322t9ym2" />
    <content type="html">
      Amethyst бомба!&lt;br/&gt;&lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nevent1qqs02jzr4a3e0auw88a8tklrklmau98trrz0n3twvrncyk3vvu2hrxcpzpmhxue69uhkummnw3ezumt0d5hsyg92jprny4srmtx5lq2zpy6k09e4vm0rk83q4z240degcwlyc65yfvpsgqqqqqqs257mhj&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;nevent1q…7mhj&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; #Amethyst v1.13.0: Web Apps, Concord, Buzz, Log in with Amethyst, Git, Bolt12 and lots more.&lt;br/&gt;&lt;br/&gt;Highlights:&lt;br/&gt;&lt;br/&gt;- Adds an **in-app Browser** for Nostr WebApps&lt;br/&gt;- Adds support for **napplets (NIP-5D)** and **nsites (NIP-5A)**&lt;br/&gt;- Adds **Concord Support (Armada)**.&lt;br/&gt;- Adds **NIP-29 Groups (Flotilla)**.&lt;br/&gt;- Adds **Buzz workspaces, with agents**.&lt;br/&gt;- Adds a **Remote Signer (NIP-46)**.&lt;br/&gt;- Adds **Git Clone Support (NIP-34)**.&lt;br/&gt;- Adds **Relay Auth permissions (NIP-42)**.&lt;br/&gt;- Adds **BitChat Geo-channels**.&lt;br/&gt;- Adds **Blossom file display and sync**.&lt;br/&gt;- Adds **Podcasting 2.0**.&lt;br/&gt;- Adds **BOLT12 payments and zaps (NIP-B1)**.&lt;br/&gt;- Adds **proof-of-work (NIP-13)** publishing.&lt;br/&gt;- Redesigns **chat messages**.&lt;br/&gt;- Redesigns **accent colors**.&lt;br/&gt;- Redesigns **push notifications**&lt;br/&gt;&lt;br/&gt;## New Features&lt;br/&gt;&lt;br/&gt;### Web Apps, Sites &amp; the Browser&lt;br/&gt;&lt;br/&gt;- Opens Nostr web apps (NIP-5D napplets) and static websites (NIP-5A nSites)&lt;br/&gt;  directly inside Amethyst, rendered in an isolated, keyless sandbox process that&lt;br/&gt;  cannot reach your private key, storage, or data.&lt;br/&gt;- Adds an in-app Browser — a drawer entry and pinnable bottom-bar tab — with an&lt;br/&gt;  omnibox address bar, autocomplete, history, favorites, recents, and captured&lt;br/&gt;  favicons. The address bar is drawn by Amethyst, never by the page, so its URL&lt;br/&gt;  cannot be spoofed.&lt;br/&gt;- Adds &#34;Log in with Amethyst&#34;: nSites open with a NIP-07 `window.nostr`&lt;br/&gt;  provider, so standard Nostr web apps can sign in and request signatures as your&lt;br/&gt;  active account — consent-gated, sign-only, and scoped per site.&lt;br/&gt;- Lets web apps, with your permission, pay through your wallet (NWC), run live&lt;br/&gt;  relay subscriptions and queries, and read your identity (profile, lists, zaps,&lt;br/&gt;  badges) — every capability brokered and permission-gated (once / this session /&lt;br/&gt;  always). Payments always prompt with the amount shown.&lt;br/&gt;- Pins favorite web apps to the bottom bar as embedded, swap-in-place tabs that&lt;br/&gt;  stay warm between visits.&lt;br/&gt;- Discovers web apps: the empty browser suggests a curated list plus nSites and&lt;br/&gt;  napplets published by people you follow, and profiles gain an &#34;Apps &amp; Sites&#34;&lt;br/&gt;  tab.&lt;br/&gt;- Adds a Connected Apps / permissions screen to review and revoke what each app&lt;br/&gt;  can do.&lt;br/&gt;- Routes nSite web traffic through Tor by default when Tor is active, with a&lt;br/&gt;  per-site onion/globe toggle.&lt;br/&gt;- Gives each account its own web storage — cookies, logins, and site data no&lt;br/&gt;  longer leak between the accounts on your device. Sites you were already signed&lt;br/&gt;  into are signed out once; signing back in stores the session under the account&lt;br/&gt;  you are using, and switching away and back keeps it.&lt;br/&gt;- Scopes granted permissions per account too, so each app asks once more under&lt;br/&gt;  each account you use it with. A grant by one account no longer applies to the&lt;br/&gt;  others.&lt;br/&gt;&lt;br/&gt;### Communities (Concord)&lt;br/&gt;&lt;br/&gt;- Adds Concord: an end-to-end-encrypted communities protocol with channels,&lt;br/&gt;  membership, invites, roles, moderation, and history — reachable from a hub in&lt;br/&gt;  the drawer and pinnable to the bottom nav.&lt;br/&gt;- Creates and edits communities with encrypted icon/banner, relay editing, and&lt;br/&gt;  channel management.&lt;br/&gt;- Invites and joins via minted invites with QR codes, tappable invite links,&lt;br/&gt;  paste-to-redeem from Search, deep links, and direct member invites.&lt;br/&gt;- Chats in channels with a rich composer (@mentions, custom-emoji autocomplete,&lt;br/&gt;  reply preview), encrypted image messages, reactions, replies, and typing&lt;br/&gt;  indicators.&lt;br/&gt;- Adds threaded replies (inline or minichat modes) and delivery ticks for your&lt;br/&gt;  own messages.&lt;br/&gt;- Groups channels by community in Messages with last-message previews, unread&lt;br/&gt;  dots, facepiles, live typing, and per-type load toggles.&lt;br/&gt;- Adds moderation: ban/unban with read-time enforcement, role grants, a &#34;Make&lt;br/&gt;  admin&#34; toggle, and a full member roster. A ban hides a member&#39;s posts for&lt;br/&gt;  everyone else; removing their access to the community&#39;s keys takes a&lt;br/&gt;  Refounding.&lt;br/&gt;- Backfills channel history across epochs, paging back to the true start of a&lt;br/&gt;  channel.&lt;br/&gt;- Surfaces Concord replies and reactions on the Notifications tab with a&lt;br/&gt;  community pill.&lt;br/&gt;- Lets authors edit their own channel messages (kind 3302). Latest edit wins,&lt;br/&gt;  and it is non-destructive, so reactions and replies stay attached. Only the&lt;br/&gt;  original author&#39;s edits take effect.&lt;br/&gt;&lt;br/&gt;### Git Collaboration (NIP-34)&lt;br/&gt;&lt;br/&gt;- Browses Nostr git repositories in-app: a Git Repositories feed and a per-repo&lt;br/&gt;  screen with README and Code tabs.&lt;br/&gt;- Reads code with branch/tag switching, file search, image preview, commit&lt;br/&gt;  history, syntax highlighting, and word-level diff highlighting.&lt;br/&gt;- Reviews patches and pull requests with computed diffs and status actions; PR&lt;br/&gt;  updates surface on the repo screen. The code browser needs a repository with an&lt;br/&gt;  http(s) clone URL.&lt;br/&gt;- Manages issues: Issues and Patches &amp; PRs tabs split by open/closed, issue&lt;br/&gt;  labels with filtering, and a full-screen New Issue composer.&lt;br/&gt;- Edits a repository announcement from the repo screen, bookmarks repositories,&lt;br/&gt;  and filters the feed to your own repos.&lt;br/&gt;- Adds a project-home dashboard with stats, languages, recent activity, and&lt;br/&gt;  last-commit rows.&lt;br/&gt;&lt;br/&gt;### Location Channels&lt;br/&gt;&lt;br/&gt;- Adds Location Channels: geohash-based public rooms that interoperate with&lt;br/&gt;  BitChat, browsable from a dedicated drawer list and pinnable to the bottom nav.&lt;br/&gt;- Posts under an unlinkable per-area anonymous identity, or opt in to post as&lt;br/&gt;  your real account. An optional nickname survives restarts, but it is a single&lt;br/&gt;  handle reused in every area — setting one links your posts across areas.&lt;br/&gt;- Teleports to any place from a map picker or the feed-filter dialog to read and&lt;br/&gt;  post to distant rooms, and follows a teleported place to keep its feed.&lt;br/&gt;- Reacts, zaps, and replies on location messages, with a &#34;live near you&#34; bubble&lt;br/&gt;  on Home surfacing nearby rooms.&lt;br/&gt;- Adds a &#34;pick on map&#34; location picker to the short-note and all other composers.&lt;br/&gt;&lt;br/&gt;### Groups (NIP-29)&lt;br/&gt;&lt;br/&gt;- Adds relay groups: group chat, a discovery feed with a top-bar filter and&lt;br/&gt;  favorites, and join / leave / create / invite actions.&lt;br/&gt;- Adds subgroups (parent/child hierarchy), custom roles (kind 39003), threads,&lt;br/&gt;  and message pinning.&lt;br/&gt;- Shares groups via `naddr` and invite links with one-tap join; inline group&lt;br/&gt;  links render as self-loading cards.&lt;br/&gt;- Adds a map-based location picker when creating a group, and lets pinned group&lt;br/&gt;  tabs act as bottom-nav roots.&lt;br/&gt;&lt;br/&gt;### Buzz (Agent Workspaces)&lt;br/&gt;&lt;br/&gt;- Adds Buzz: a self-hosted workspace where humans and AI agents build together on&lt;br/&gt;  a relay you own, built on the NIP-29 relay-group family with plaintext content&lt;br/&gt;  so the relay can run search, audit, and workflows. Reachable from a &#34;Buzz&lt;br/&gt;  Workspaces&#34; bottom-nav tab and the drawer Feeds list.&lt;br/&gt;- Renders workspace channels natively and composes messages; sections a community&lt;br/&gt;  into Channels, Forums, inline DMs, and an Agent Console; and renders forum posts&lt;br/&gt;  as Concord-style threads with the full chat composer.&lt;br/&gt;- Adds an agent-owner console with cost and personas tabs, an agent-fleet cost&lt;br/&gt;  aggregator, live observer telemetry, persona create/edit, and NIP-OA attestation&lt;br/&gt;  issuance.&lt;br/&gt;- Adds live typing indicators, presence dots, collapsible sections with unread and&lt;br/&gt;  stars, a workspace canvas viewer and edit composer, and a bot &#34;Working…&#34;&lt;br/&gt;  indicator.&lt;br/&gt;- Invites people to a channel or community and mints invite links; redeems invite&lt;br/&gt;  links (intercepted into the in-app browser) and auto-invites mentioned&lt;br/&gt;  non-members.&lt;br/&gt;- Wires Buzz direct messages end to end, titles a DM by its participant, and&lt;br/&gt;  surfaces Buzz DMs in the Notification feed rendered as messages.&lt;br/&gt;- Discovers workspaces and DMs via the relay&#39;s own kinds, imports workspace&lt;br/&gt;  channels from a relay in &#34;Find groups&#34;, and routes Tor workspaces to clearnet&lt;br/&gt;  when needed.&lt;br/&gt;- Adds a shared **Agent Work board**. Any channel member files a task, upvotes&lt;br/&gt;  to reprioritize it, and watches the workspace&#39;s agent carry it to a pull&lt;br/&gt;  request. Jobs that ship directly and gated workflow runs fold into one board,&lt;br/&gt;  grouped by Needs approval / Working / Up next / Shipped.&lt;br/&gt;- Approves or denies a gated run in place. The &#34;Approve &amp; open PR&#34; step&lt;br/&gt;  authorizes a push and PR, but never merges or deploys. Adds a confirm step, an&lt;br/&gt;  approver and workflow-definition picker, and Buzz Agent Persona editors for&lt;br/&gt;  model, provider, and runtime.&lt;br/&gt;- Asks before adding you to a channel someone else put you in (Accept / Ignore /&lt;br/&gt;  Leave). Narrates channel changes as plain-language system lines: &#34;Bob added&lt;br/&gt;  Alice&#34;, topic, visibility, and TTL changes, and more.&lt;br/&gt;- Notifies the requester when their agent job finishes or fails. Lets a&lt;br/&gt;  self-hosted geode relay be the private Buzz workspace via a member-and-agent&lt;br/&gt;  membership policy.&lt;br/&gt;&lt;br/&gt;### Chat &amp; Messages&lt;br/&gt;&lt;br/&gt;- Redesigns message rendering across every chat — DMs, public chats, groups, and&lt;br/&gt;  communities — with modern bubbles, swipe-to-reply, send motion and press&lt;br/&gt;  feedback, per-author name colors, jumbo emoji, day headers drawn above the&lt;br/&gt;  messages they introduce, and a timestamp on the last message of each author&lt;br/&gt;  run.&lt;br/&gt;- Replaces the message 3-dot menu with a compact two-stage long-press sheet that&lt;br/&gt;  unpacks wrapping reactions and zap-amount presets in place.&lt;br/&gt;- Renders channel admin events as centered system messages, and hides a reply&lt;br/&gt;  quote when it targets the message directly above.&lt;br/&gt;- Replaces the Messages FAB speed-dial with a full-screen, color-coded&lt;br/&gt;  new-conversation chooser, and adds a Messages settings screen with a&lt;br/&gt;  grouped-by-relay view and per-type load toggles.&lt;br/&gt;- Warns about DMs from senders reported by people you follow: flags a reported&lt;br/&gt;  counterpart on the chat-list row and inside the room, with a per-user&lt;br/&gt;  report-warning flow.&lt;br/&gt;&lt;br/&gt;### Notifications&lt;br/&gt;&lt;br/&gt;- Redesigns push notifications into per-kind, observable, richly-rendered&lt;br/&gt;  notifications that resolve inline @npub mentions to display names, render an&lt;br/&gt;  inline image link as the big picture, and attribute a reply&#39;s parent to its real&lt;br/&gt;  author.&lt;br/&gt;- Adds push notifications for Buzz DMs and for bare reactions and reposts to your&lt;br/&gt;  notes, with repost-mute parity. Auto-dismisses a tray notification once its&lt;br/&gt;  event is read in-app.&lt;br/&gt;- Rebuilds the in-app Notifications tab with infinite-scroll paging via a&lt;br/&gt;  look-ahead buffer, time-based history paging with in-feed load markers, and&lt;br/&gt;  auto-retry of stalled or faulty relays with an actionable relay detail.&lt;br/&gt;&lt;br/&gt;### Remote Signer &amp; Security&lt;br/&gt;&lt;br/&gt;- Lets other apps and websites sign through Amethyst for the first time&lt;br/&gt;  (NIP-46): connect by scanning or pasting a `nostrconnect://` code, and keep&lt;br/&gt;  signing in the background — whether your key is stored directly in Amethyst or&lt;br/&gt;  delegated to an external signer like Amber (NIP-55).&lt;br/&gt;- Asks for informed consent before authorizing an app — showing its name and&lt;br/&gt;  icon, which account will sign, the exact permissions, and an event preview —&lt;br/&gt;  with per-account sheets and one-tap batched approval.&lt;br/&gt;- Manages connected apps from a dedicated screen with per-app relay list, live&lt;br/&gt;  health, time-bound grants, and instant &#34;forget this app&#34;.&lt;br/&gt;- Adds interactive relay login prompts (NIP-42): choose Once / Always / Never&lt;br/&gt;  per relay, with venue-aware prompts for public chats, communities, and live&lt;br/&gt;  streams, and one-tap rules to trust relays used by people you follow. Apps&lt;br/&gt;  connected through the remote signer now ask before signing a relay login,&lt;br/&gt;  instead of approving it automatically under &#34;Let&#39;s be reasonable&#34;.&lt;br/&gt;&lt;br/&gt;### Web of Trust (GrapeRank)&lt;br/&gt;&lt;br/&gt;- Discovers Web-of-Trust score providers via NIP-85 and shows hop distance and&lt;br/&gt;  follower count on trust cards. Computing the scores — crawling the social graph,&lt;br/&gt;  reverse-follower crawling, and publishing NIP-85 cards — is done by the `amy`&lt;br/&gt;  command-line tool, not the app; see the Cli section.&lt;br/&gt;&lt;br/&gt;### Publishing &amp; Sync&lt;br/&gt;&lt;br/&gt;- Adds proof-of-work (NIP-13) publishing: a fire-and-forget mining queue with&lt;br/&gt;  per-account difficulty and per-category settings, scheduled-post mining, and&lt;br/&gt;  per-post overrides, shielded by a foreground service and mined across half the&lt;br/&gt;  device&#39;s cores.&lt;br/&gt;- Adds NIP-77 negentropy sync as a first-class capability, with deletion&lt;br/&gt;  (NIP-09/62) propagation so scoped syncs no longer strand deletions.&lt;br/&gt;- Shows PoW mining progress, and surfaces PoW, OpenTimestamps, and location&lt;br/&gt;  markers as tap-to-explain pills in the note header.&lt;br/&gt;&lt;br/&gt;### Podcasts&lt;br/&gt;&lt;br/&gt;- Adds Podcasting 2.0: renders shows in detail and thread views, surfaces&lt;br/&gt;  episodes in the merged podcast feed, and plays trailers.&lt;br/&gt;- Shows person credits as real Nostr profiles, soundbites, in-app chapters, a&lt;br/&gt;  transcript viewer, and a Top Supporters leaderboard.&lt;br/&gt;- Adds per-episode reactions and NIP-22 comments, a Podcast Bookmarks screen, and&lt;br/&gt;  value-for-value Lightning splits paid per-minute during real playback.&lt;br/&gt;- Adds in-app podcast authoring: create and edit shows, episodes, and trailers&lt;br/&gt;  from an authoring hub, with a value-for-value split editor that adds Nostr&lt;br/&gt;  recipients by search. Verifies NIP-F4 podcast authors against their kind-10064&lt;br/&gt;  counter-claims.&lt;br/&gt;&lt;br/&gt;### BOLT12 Payments &amp; Zaps (NIP-B1)&lt;br/&gt;&lt;br/&gt;- Adds BOLT12 zaps: self-verifying kind-9736 events that prove a real BOLT12&lt;br/&gt;  Lightning payment. They carry a settlement proof instead of relying on an&lt;br/&gt;  LNURL receipt. They fold into the same zap total and reactions row as Lightning&lt;br/&gt;  zaps, with anonymous and receiptless (pay-only) variants. Only cryptographically&lt;br/&gt;  verified proofs count toward the total.&lt;br/&gt;- Publishes and edits your own BOLT12 offer list (kind 10058) from an in-app&lt;br/&gt;  editor. The list is cached, kept live, and restored across restarts.&lt;br/&gt;- Pays a recipient&#39;s published offer. Hand it to an external wallet as a&lt;br/&gt;  `bitcoin:?lno=` (BIP21) intent, or pay in-app over a NWC wallet that supports&lt;br/&gt;  it.&lt;br/&gt;- Sends zaps over NWC, using the new `pay`/`receive` methods&lt;br/&gt;  (nostr-wallet-connect/nwc#2). Prefers BOLT12 over Lightning when the recipient&lt;br/&gt;  offers it and the wallet supports it, and falls back to a Lightning zap&lt;br/&gt;  otherwise.&lt;br/&gt;- Verifies payer proofs cryptographically: payment-hash preimage, invoice and&lt;br/&gt;  proof signatures, and BOLT12 merkle reconstruction of selectively disclosed&lt;br/&gt;  fields. Dims and does not count a proof that can&#39;t be bound to the offer.&lt;br/&gt;&lt;br/&gt;### Wallet &amp; Payments&lt;br/&gt;&lt;br/&gt;- Adds a Cashu wallet setup wizard: find-or-create with cross-relay discovery,&lt;br/&gt;  mint suggestions, and a CashuMints screen; the wallet auto-publishes on mint&lt;br/&gt;  add/remove.&lt;br/&gt;- Claims P2PK-locked Cashu tokens (NUT-11). Matches the lock against your wallet&lt;br/&gt;  or identity key, and redeems all-or-nothing. Gives a clear error when a token&lt;br/&gt;  is locked to a key this wallet can&#39;t sign for.&lt;br/&gt;- Adds a setting to hide the on-chain (Bitcoin) wallet, including from zap&lt;br/&gt;  buttons.&lt;br/&gt;- Prefers NIP-44 encryption for NWC when the wallet advertises it. Adds a NWC-07&lt;br/&gt;  deep-link pairing helper. Posts a tray notification for incoming non-zap&lt;br/&gt;  Lightning payments.&lt;br/&gt;&lt;br/&gt;### Battery, Data &amp; Background Service&lt;br/&gt;&lt;br/&gt;- Adds a resource-usage ledger: on-device battery and data accounting across&lt;br/&gt;  relay connections, media, HTTP, proof-of-work, Tor, calls, decrypts, and&lt;br/&gt;  remote signs, with per-screen foreground time and reconnect-churn tracking.&lt;br/&gt;  Optional NIP-17 reports mail the summary to yourself.&lt;br/&gt;- Presents it on a usage screen with stat tiles, a trend chart, proportion bars,&lt;br/&gt;  cellular-first bars, a Tor card, actionable insights, and a live memory card.&lt;br/&gt;- Adds a master switch for the always-on background notification service with&lt;br/&gt;  per-account participation, a cost card that links to notification settings,&lt;br/&gt;  and a distinct status-bar icon.&lt;br/&gt;- Scales `LocalCache` pruning to the OS memory-pressure level, and trims feed&lt;br/&gt;  lists, rich-text/robohash/relay-info caches, the image cache, and the player&lt;br/&gt;  warm pool under pressure.&lt;br/&gt;&lt;br/&gt;### Look, Media &amp; Navigation&lt;br/&gt;&lt;br/&gt;- Adds theme customization: pick an accent color (with a swatch picker), font,&lt;br/&gt;  and font size. The accent now drives Material 3 containers, buttons, FABs,&lt;br/&gt;  switches, unread dots, selected-reaction highlights, verified NIP-05 / image&lt;br/&gt;  marks, and the Following badge.&lt;br/&gt;- Redesigns UI Preferences into grouped in-screen options with live font&lt;br/&gt;  previews, and adds a settings search filter in the app bar.&lt;br/&gt;- Adds a Blossom media file manager: browse and manage stored blobs with per-file&lt;br/&gt;  controls, mirror and `/media` toggles, an app-level &#34;Sync all&#34; with progress,&lt;br/&gt;  and BUD-07 confirm-then-pay mirroring for paid servers.&lt;br/&gt;- Extends the Blossom manager with a gallery grid (video thumbnails and a&lt;br/&gt;  full-screen zoomable viewer) and a per-file detail sheet. Adds an importer that&lt;br/&gt;  copies blobs from other Blossom servers into yours. Falls back to a verified&lt;br/&gt;  download-and-reupload when a target has no `/mirror`.&lt;br/&gt;- Redesigns the Media Servers screen as a single auto-saving canvas with a&lt;br/&gt;  reorderable priority list and cached health probes.&lt;br/&gt;- Redesigns the bottom-bar setup with a live preview, drag-to-reorder, and real&lt;br/&gt;  favicons; the default bar becomes Home, Messages, Wallet, Browser,&lt;br/&gt;  Notifications.&lt;br/&gt;- Adapts the app shell to large screens: tier-scaled navigation transitions, a&lt;br/&gt;  reading-column width cap on wide panes, and a two-pane Messages layout.&lt;br/&gt;- Nicknames people with NIP-85 contact cards (kind 30382) signed by your account&lt;br/&gt;  key. The nickname shows above their real display name on the profile and&lt;br/&gt;  supports custom emoji.&lt;br/&gt;- Adds fitness support: renders POWR strength workouts (kind 1301) and exercise&lt;br/&gt;  templates (kind 33401) as cards, and merges close-by Health Connect sessions of&lt;br/&gt;  the same type.&lt;br/&gt;- Renders Birdstar bird detections (kind 2473) with common-name titles and&lt;br/&gt;  Wikidata links, surfaces Birdex life lists on home and profile, and renders PS1&lt;br/&gt;  memory-card saves (kind 38192) with an animated BIOS icon.&lt;br/&gt;- Adds a compose signature pre-filled in text-based post screens, and an optional&lt;br/&gt;  subject/title field in the short-note composer.&lt;br/&gt;- Renders NIP-30 custom-emoji reactions as an avatar badge, a lone zap/nutzap as&lt;br/&gt;  a large activity card, and NIP-84 highlights from web highlighter clients.&lt;br/&gt;- Supports NIP-51 mute-list hashtag entries and public-chat reply notifications.&lt;br/&gt;- Modernizes the Privacy, Profile UI, Home Tabs, and Calendar Reminder settings&lt;br/&gt;  screens into grouped in-screen options.&lt;br/&gt;- Adds &#34;Share as QR&#34; for a note, with a choice of `note` or `naddr` payload and an&lt;br/&gt;  image thumbnail for image-only notes.&lt;br/&gt;- Resolves NIP-05 identifiers (including Namecoin `.bit`) in the @-mention&lt;br/&gt;  popover, wiring them to `nostr:` mentions.&lt;br/&gt;&lt;br/&gt;## Performance&lt;br/&gt;&lt;br/&gt;- Speeds up napplet/nSite opens by overlapping WebView init, prefetching blobs in&lt;br/&gt;  parallel, and fast-serving content-addressed blobs from cache.&lt;br/&gt;- Substantially faster GrapeRank crawls (background IO, mass pre-connect with&lt;br/&gt;  cached DNS, batched contact reads, parallel outbox fetches, early dead-relay&lt;br/&gt;  pruning) and faster scoring via Gauss-Seidel sweeps over a compact integer&lt;br/&gt;  graph.&lt;br/&gt;- Speeds up NIP-77 reconcile with direct-built wire frames (~2.5x), O(1) range&lt;br/&gt;  fingerprints, a live negentropy index, and an allocation-free idle watchdog.&lt;br/&gt;- Prefetches media and pre-parses note text ahead of the viewport, adds a k-way&lt;br/&gt;  merge for the home feed, and pins indexes for multi-author queries.&lt;br/&gt;- Adopts a caching event decoder across Android/Desktop/CLI, batches Schnorr&lt;br/&gt;  verification off the receive path, and keeps light/dark resolution O(1) after&lt;br/&gt;  an accent change.&lt;br/&gt;- Parallelizes Blossom &#34;Sync all&#34;, prefetches a joined group&#39;s history, and mines&lt;br/&gt;  proof-of-work on half the device&#39;s cores.&lt;br/&gt;- Orders NIP-50 relay search by bm25 relevance and scales search and tag-watcher&lt;br/&gt;  queries with corpus size, picking the SQLite filesystem driver by cost and&lt;br/&gt;  materializing indexes at runtime.&lt;br/&gt;- Removes live-path allocations in `LiveEventStore` and `FilterIndex` (and on the&lt;br/&gt;  frame/search paths), and snapshots `FilterIndex` with a persistent map.&lt;br/&gt;&lt;br/&gt;## Improvements and Bug fixes&lt;br/&gt;&lt;br/&gt;- Normalizes accent theming: contrast-picks onPrimary so filled buttons/FABs stop&lt;br/&gt;  washing out, bases light/dark on background luminance, and fixes accent&lt;br/&gt;  regressions.&lt;br/&gt;- Keeps live HLS streams playing and caches only proven on-demand HLS; shows a&lt;br/&gt;  browser-fallback overlay when a decoder stalls and pauses looping videos after&lt;br/&gt;  5 plays.&lt;br/&gt;- Adds an HTTP/2 keepalive ping to stop stale-connection image stalls.&lt;br/&gt;- Hardens the relay client: enforces blocked relays on every REQ/COUNT/publish,&lt;br/&gt;  backs off from REQs relays repeatedly refuse, drops relays that fail hard&lt;br/&gt;  during crawls, caches each relay&#39;s advertised LIMITS, and fixes reconnect&lt;br/&gt;  backoff on network/transport changes.&lt;br/&gt;- Shows and edits Marmot (MLS) group icons in the feed and in group metadata,&lt;br/&gt;  interoperable with other Marmot clients.&lt;br/&gt;- Opens zaps and reactions in their own thread view, turns Notify chips into bell&lt;br/&gt;  mute-toggles that list every thread member, and replies with kind 1111 to&lt;br/&gt;  Amethyst&#39;s own kind-1 thread roots.&lt;br/&gt;- Adds search, a local filter, and a top-nav feed filter to the App&lt;br/&gt;  Recommendations screen, and shows a website&#39;s favicon and domain across every&lt;br/&gt;  browser-connected app view.&lt;br/&gt;- Fixes nutzap relay routing to receive/advertise on inbox/DM (kind 10019)&lt;br/&gt;  relays instead of outbox.&lt;br/&gt;- Fixes Concord invite handling (revocation, keyless CORD-05, clearer failure&lt;br/&gt;  copy, no hang on bad links, skip re-join) and channel rows stuck on &#34;No&lt;br/&gt;  messages yet&#34;.&lt;br/&gt;- Persists the Concord community list and loads pinned communities from their own&lt;br/&gt;  relays so cold boot no longer refetches, shows channels on Messages as soon as&lt;br/&gt;  the control plane folds, warms channel previews so the list fills without opening&lt;br/&gt;  each channel, and rank-gates the Ban/Remove affordances (CORD-04).&lt;br/&gt;- Sizes the video player box so live streams stop rendering black bars, and&lt;br/&gt;  enforces the decoder budget when acquiring players.&lt;br/&gt;- Stops stamping our client tag on someone else&#39;s event template so external&lt;br/&gt;  signers sign it unchanged.&lt;br/&gt;- Keeps calendar RSVP buttons on a single line, drops dead top padding on Home&lt;br/&gt;  when there are no live bubbles, and modernizes the Zap the Devs donation card.&lt;br/&gt;- Rejects NIP-29 group state not signed by the relay, opens group posts in the&lt;br/&gt;  group chat, and fixes subgroup edit safety and pinned-message jump.&lt;br/&gt;- Makes tapping a message timestamp open delivery info instead of toggling the&lt;br/&gt;  time format, and right-aligns your own messages.&lt;br/&gt;- Recovers a media file&#39;s type from its extension when the imeta MIME is&lt;br/&gt;  malformed, and moves several disk reads (boot receiver, signer policy) off the&lt;br/&gt;  main thread.&lt;br/&gt;- Serializes account construction so concurrent loaders can&#39;t build duplicate&lt;br/&gt;  accounts.&lt;br/&gt;- Routes Onion-Location through the Android app&#39;s HTTP clients and maps Tor/Arti&lt;br/&gt;  errors to accurate SOCKS reply codes.&lt;br/&gt;- Extracts the rich-text renderer and many event cards (calendar/RSVP, podcast&lt;br/&gt;  atoms/splits, relay discovery, code snippet, ecash mint, activity, Git&lt;br/&gt;  diff/status, and more) into shared commons so Desktop and Android render&lt;br/&gt;  identically.&lt;br/&gt;- Sends pictures in minichat thread replies (encrypted in Concord, plaintext in&lt;br/&gt;  public chats). Resolves @-mentions in the minichat composer and tray&lt;br/&gt;  quick-replies. Adds `p` tags for people cited in kind 9/11/1111 and Buzz stream&lt;br/&gt;  messages, so mentions notify and resolve.&lt;br/&gt;- Stops the inline audio player from painting over the note below it. Marks&lt;br/&gt;  every room type read from the Messages &#34;mark as read&#34; action.&lt;br/&gt;- Fixes numeric HTML entities in link-preview meta tags. Routes kind-39005 by tag&lt;br/&gt;  shape, so Buzz thread summaries no longer parse as NIP-29 pin lists.&lt;br/&gt;- Shortens over-long translated strings across 23 locales and fixes duplicate&lt;br/&gt;  and CDATA translation issues.&lt;br/&gt;&lt;br/&gt;## Desktop&lt;br/&gt;&lt;br/&gt;- Redesigns notifications with a reworked inbox and native OS toast&lt;br/&gt;  notifications.&lt;br/&gt;- Adds NIP-42 relay AUTH with an inline Once / Always / Never approval banner and&lt;br/&gt;  persisted grants.&lt;br/&gt;- Makes NIP-17 private DMs reliable: resolves recipient inbox relays, fetches DM&lt;br/&gt;  relay lists and account/Blossom config from outbox relays, and stops falling&lt;br/&gt;  back to connected relays.&lt;br/&gt;- Adds Web-of-Trust score badges, Follow Packs (NIP-51) discovery with one-tap&lt;br/&gt;  follow, note scheduling, opt-in NIP-37 draft sync, and a hashtag-spam filter.&lt;br/&gt;- Adds a Privacy Lock: gate the Messages and Wallet columns behind a password,&lt;br/&gt;  with an auto-lock timeout. It is a screen gate, not encryption at rest —&lt;br/&gt;  messages continue to sync while it is locked.&lt;br/&gt;- Renders rich text through the shared core (removes the desktop-only fork) and&lt;br/&gt;  ships as a Flatpak bundle.&lt;br/&gt;- Adds moderation &amp; safety: mute/block and NIP-56 report actions in the note menu&lt;br/&gt;  with feed, thread, and profile enforcement (previously a silent no-op), NIP-36&lt;br/&gt;  content-warning blur with tap-to-reveal, a sensitive-content toggle, and&lt;br/&gt;  management screens — with snackbar feedback and zero-relay send warnings.&lt;br/&gt;- Adds NIP-88 polls (render, vote, create) with a &#34;Polls&#34; search facet, and&lt;br/&gt;  unifies the note ⋮ overflow and right-click menus.&lt;br/&gt;- Fixes a desktop-cache race that could wipe the follow list, and makes sidebar&lt;br/&gt;  navigation replace the detail overlay instead of hiding behind it.&lt;br/&gt;&lt;br/&gt;## Cli&lt;br/&gt;&lt;br/&gt;- Adds nak-style primitives: `amy decode`/`encode` (NIP-19/21), `verify`, `key`&lt;br/&gt;  (generate/public/encrypt/decrypt/validate, NIP-49), and `filter`.&lt;br/&gt;- Adds query verbs: `amy fetch` (one-shot with code-mode outbox resolution),&lt;br/&gt;  `subscribe` (live NDJSON), `count` (NIP-45), and `outbox USER` (NIP-65).&lt;br/&gt;- Adds `amy sync` — NIP-77 negentropy reconcile with deletion propagation — and&lt;br/&gt;  `amy event` / `amy publish` for raw and pre-signed events.&lt;br/&gt;- Adds `amy encrypt`/`decrypt` (NIP-44/04) and `amy gift wrap`/`unwrap` (NIP-59).&lt;br/&gt;- Adds `amy blossom` (upload/download/list/delete/check/mirror, NIP-B7) with a&lt;br/&gt;  live interop smoke test.&lt;br/&gt;- Adds `amy git` (NIP-34), `amy podcast` and `amy podcast20` (Podcasting 2.0 with&lt;br/&gt;  V4V splits).&lt;br/&gt;- Rounds out `amy git` to full NIP-34 parity: `browse`/`cat`/`log` over&lt;br/&gt;  smart-HTTP, `init` from a local checkout, `label` (NIP-32), `apply` a patch to&lt;br/&gt;  the working tree, and `grasp list`/`set` (GRASP server list, kind 10317).&lt;br/&gt;- Adds `amy buzz` for block/buzz workspaces (channels, DMs, invite-link&lt;br/&gt;  redemption), verified against a live Buzz relay.&lt;br/&gt;- Turns `amy` into the Buzz workflow/agent runner. `buzz agent serve`/`up`/&lt;br/&gt;  `doctor` run gated or parallel-backlog agents in isolated git worktrees that&lt;br/&gt;  open PRs. `buzz workflow trigger`/`run`/`approve`/`deny` drive the human&lt;br/&gt;  approval gate.&lt;br/&gt;- Adds `amy bolt12` (NIP-B1): decode offers and payer proofs, verify a zap,&lt;br/&gt;  get/set a kind-10058 offer list, and a two-step intent → zap send.&lt;br/&gt;- Adds the `amy cashu` wallet (NIP-60/61): wallet lifecycle, balance, mint,&lt;br/&gt;  receive/send (LN / token / nutzap), and maintenance.&lt;br/&gt;- Adds `amy admin` (NIP-86 relay moderation) and `amy serve` (run a relay by&lt;br/&gt;  embedding geode).&lt;br/&gt;- Adds NIP-46 remote signing: `amy bunker` server, `amy login bunker://…`, and&lt;br/&gt;  `amy login --nostrconnect`, gated with `--perms` and interactive approval.&lt;br/&gt;- Adds the `amy graperank` suite (crawl/score/publish/followers/rank/…),&lt;br/&gt;  account-less crawl/score, and NIP-85 card publishing.&lt;br/&gt;- Adds `amy fof` (follows-of-follows, renamed from `amy wot`), `amy concord`&lt;br/&gt;  (encrypted communities), `amy relaygroup` (NIP-29), and `amy geochat`&lt;br/&gt;  (BitChat-interoperable geohash channels).&lt;br/&gt;- Adds NIP-13 proof of work (`amy pow`, `--pow` on posts), `amy kind`, `amy nip`,&lt;br/&gt;  `amy namecoin`, `amy status`, and `amy logoff`.&lt;br/&gt;- Expands `amy nsite`/`napplet` with `publish`, `serve`, and `list`.&lt;br/&gt;- Switches the default event store to SQLite and hardens the output contract:&lt;br/&gt;  single-line `--json`, exit codes 0/1/2/124, publish results carry each relay&#39;s&lt;br/&gt;  rejection reason, and read-only verbs run without an account.&lt;br/&gt;&lt;br/&gt;## Quartz&lt;br/&gt;&lt;br/&gt;- Adds NIP-77 negentropy sync (pipelined worker pool, multi-connection fan-out,&lt;br/&gt;  bounded-memory streaming, `LiveNegentropyIndex`) and NIP-09/62 deletion&lt;br/&gt;  propagation.&lt;br/&gt;- Adds NIP-13 proof-of-work publishing: a cooperative-cancellation miner and a&lt;br/&gt;  `PoWNostrSigner` decorator that composes with any signer, plus NIP-59&lt;br/&gt;  gift-wrap mining on the outer wrap only.&lt;br/&gt;- Adds NIP-66 `RelayReachabilityStore` — a durable, shareable dead-relay cache&lt;br/&gt;  backed by kind:30166 events.&lt;br/&gt;- Adds the Concord/CORD protocol foundation (key derivation, envelope layer,&lt;br/&gt;  authority resolver, roles/moderation, CORD-05/06/07) and the NIP-5D/5A&lt;br/&gt;  trust-boundary core (capability model, permission ledger, broker, wire&lt;br/&gt;  protocol).&lt;br/&gt;- Implements Marmot (MLS-over-Nostr) group icons byte-for-byte with the&lt;br/&gt;  mdk/whitenoise scheme, and fixes SecretTree ratchet preservation across&lt;br/&gt;  restore.&lt;br/&gt;- Adds an OutboxDispatcher to fetch profile/contact events via each author&#39;s&lt;br/&gt;  outbox relays, and richer NIP-89 app-handler parsing.&lt;br/&gt;- Adds the Buzz protocol surface (~78 event kinds spanning NIP-OA owner&lt;br/&gt;  attestation, NIP-AM agent turn metrics, personas/teams/managed agents, streams,&lt;br/&gt;  DMs, forums, presence, and moderation), verified against vectors generated by&lt;br/&gt;  Buzz&#39;s own Rust reference.&lt;br/&gt;- Adds the BOLT12 zaps protocol layer (NIP-B1): kind-9736 zaps, kind-9737 zap&lt;br/&gt;  intents, kind-10058 offer lists, full spec validation, and a payer-proof&lt;br/&gt;  verifier with BOLT12 merkle reconstruction. NWC gains `pay`/`receive` methods.&lt;br/&gt;- Widens NIP-50 search indexing to more event kinds and tag-borne text. Indexes&lt;br/&gt;  only the public petname and summary on contact cards (kind 30382), never the&lt;br/&gt;  encrypted fields.&lt;br/&gt;&lt;br/&gt;## Geode (standalone relay)&lt;br/&gt;&lt;br/&gt;- Adds relay-to-relay mirroring with strfry-router parity: a two-phase model&lt;br/&gt;  (NIP-77 negentropy sync catch-up plus a live REQ tail), `down` / `up` / `both`&lt;br/&gt;  directions, per-upstream mirror filters, and relay-to-relay trust.&lt;br/&gt;- Keeps mirrors alive across upstream restarts with a retry pump and ping&lt;br/&gt;  keepalive, and advances the since-watermark correctly on reconnect.&lt;br/&gt;- Adds `import` / `export` NDJSON verbs and an optional no-full-text-search mode&lt;br/&gt;  (`--no-search`) for lighter deployments.&lt;br/&gt;- Adds `[database]` tuning knobs with periodic `PRAGMA optimize`, and validates&lt;br/&gt;  config knobs and mirror filters at boot.&lt;br/&gt;- Runs embedded in the CLI via `amy serve`.&lt;br/&gt;- Serves full-set negentropy NEG-OPENs from a live index and streams mirror&lt;br/&gt;  catch-up IDs instead of materializing them.&lt;br/&gt;- Adds relayBench, a head-to-head benchmark harness (geode vs strfry vs any&lt;br/&gt;  relay) measuring ingest, query, and NIP-77 sync over a shared corpus.&lt;br/&gt;- Enables a combined tag&#43;kind&#43;pubkey index, a cost-based filesystem-driver pick,&lt;br/&gt;  and runtime index materialization, with new tag∩author and driver-selection&lt;br/&gt;  relayBench shapes.&lt;br/&gt;- Ships a release pipeline: a GHCR Docker image, `.deb`/`.rpm` packages with a&lt;br/&gt;  bundled JRE and systemd unit, a portable jlink&#39;d tarball, and a Homebrew&lt;br/&gt;  formula. Adds `--version`/`--help` and a boot smoke test in CI.&lt;br/&gt;- Lets operators pick any Quartz `IEventStore` backend via `[database].backend`:&lt;br/&gt;  SQLite (default), filesystem, or a custom store loaded by class name.&lt;br/&gt;&lt;br/&gt;## Build &amp; Documentation&lt;br/&gt;&lt;br/&gt;- Rebuilds the Tor/Arti native library for the SOCKS reply-code fix, ships a&lt;br/&gt;  Homebrew formula for `amy`, and seeds the Gradle distribution from a verified&lt;br/&gt;  mirror in the web sandbox.&lt;br/&gt;- Adds NIP-29 group-chat test coverage across every assembler, filter shape, and&lt;br/&gt;  relay integration.&lt;br/&gt;- Targets JVM 17 for Quartz, upgrades AGP, and replaces the abandoned&lt;br/&gt;  android-test-report action with `mikepenz/action-junit-report`.&lt;br/&gt;- Adds a coding standard banning raw invisible/bidirectional Unicode in source&lt;br/&gt;  (Trojan-Source, CVE-2021-42574) and replaces existing occurrences with `\u`&lt;br/&gt;  escapes.&lt;br/&gt;&lt;br/&gt;## Contributors&lt;br/&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsyvrp9u6p0mfur9dfdru3d853tx9mdjuhkphxuxgfwmryja7zsvhqpzamhxue69uhhv6t5daezumn0wd68yvfwvdhk6tcpzpmhxue69uhkummnw3ezumt0d5hszythwden5te0dehhxarj9emkjmn99uwfvhl6&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;VitorPamplona&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…vhl6&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;⚡ Dee Kay ⚡&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…m3sx&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs9vyevafl4f7rqluqykt500e9nj5ase8eh5k423rgwtfw6qdjhd4spz4mhxue69uhhyetvv9ujuerpd46hxtnfduhszrnhwden5te0dehhxtnvdakz7qghwaehxw309aex2mrp0yh8qunfd4skctnwv46z7fr94k8&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;beefenergy&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…94k8&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsxeh4ue276rhaqtz4c2df209gfkkft9006qdcryh3gaswtfuvxvlgpzamhxue69uhhyetvv9ujuurjd9kkzmpwdejhgtcpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhsz9mhwden5te0wfjkccte9en82mnywd68ytndv5hsc2mjk6&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;v&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…mjk6&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs827g8dkd07zjvlhh60csytujgd3l9mz7x807xk3fewge7rwlukxgppemhxue69uhkummn9ekx7mp0qydhwumn8ghj7argv4nx7un9wd6zumn0wd68yvfwvdhk6tcpz9mhxue69uhkummnw3ezumrpdejz7d9xcpk&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;greenart7c3&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…xcpk&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsxu35yyt0mwjjh8pcz4zprhxegz69t4wr9t74vk6zne58wzh0waycpz9mhxue69uhkummnw3ezuamfdejj7qgewaehxw309ac8yetdd96k6tnswf5k6ctv9ehx2ap0qy2hwumn8ghj7mn0wd68ytn00p68ytnyv4mz7xx9ccm&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Gigi&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…9ccm&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- roguehashrate&lt;br/&gt;- LubuSeb&lt;br/&gt;&lt;br/&gt;## Translations&lt;br/&gt;&lt;br/&gt;- Czech, German, Brazilian Portuguese, and Swedish by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;⚡ Dee Kay ⚡&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…m3sx&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Spanish (Spain, Mexico, and US) by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs07tjpyvvlq9ugdpax8h3jfrpwn7kr72k3tc7ky83tggn4et9eangpg3mhxw309ajxyartwdukjery09cxwctsd3ek6cnjdfnxs6t00pnhq7ttdvmkw7nsd3shxdrr0gery6nyva3h2ct0096kyerjw9jzummwd9hkutcprpmhxue69uhkv6tvw3jhytnwdaehgu3wwa5kuef0qyghwumn8ghj7mn0wd68ytnhd9hx2tcxdyhdq&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;⚡₿it₿y₿it⚡&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…yhdq&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- French by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs8av5uzf4nv2q80chrmp3mj9a9dd6zjw4fmz56hsn2gzar72rxhtcppemhxue69uhkummn9ekx7mp0qyg8wumn8ghj7mn0wd68ytnddakj7qgawaehxw309ahx7um5wghxy6t5vdhkjmn9wgh8xmmrd9skctcuvd26f&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;DuPainEtDesJeux&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…d26f&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Hungarian by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsxekg0s8kxpcrka8ccwztv2m73kz6jy0ur8f7jc04rwr5p44w5acspzamhxue69uhhyetvv9ujumn0wd68ytnzv9hxgtcppemhxue69uhkummn9ekx7mp0qyg8wumn8ghj7mn0wd68ytnddakj7c0ns2l&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;summoner&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…ns2l&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Dutch by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs82l74z7g3x8j3avpn2wrjrwn855nyvmpxa4v5pftfvtv5lrvrc5cppemhxue69uhkummn9ekx7mp074ge6h&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Bartus&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…ge6h&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Hindi by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs88dt78wgnzvaph6fcstfvsd98xc2qs8eg8tllwv2zlutu8ehec2cppemhxue69uhkummn9ekx7mp0qythwumn8ghj7un9d3shjtnswf5k6ctv9ehx2ap0qyt8wumn8ghj7un9d3shjtnyd968gmewwp6kytcmlz0lu&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;राज&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…z0lu&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Polish by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsdyfz0ewdhmgp3a4r3pxvezx5r8yalrgvjn38v2ml5qrusnv7yywgpzemhxue69uhkummnw3ezucm6v9ejuurvw4ej7qg0waehxw309a3h5ctn9e6x7up0qyg8wumn8ghj7cm6v9ejuurvw4ej79s8c53&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Polak&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…8c53&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Slovenian by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsqqqqqqp0fmkspg7w8d305ln96a0jw0ptwqtuwskkm5pddv2kkjfcppemhxue69uhkummn9ekx7mp0qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgkwaehxw309aex2mrp0yhxg6t5w3hjuur4vghsdu406e&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;StellarStoic&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…406e&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Chinese Simplified by hypnotichemionus4&lt;br/&gt;- German by crowdin.pretended462 &lt;/blockquote&gt;
    </content>
    <updated>2026-07-29T11:09:36Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqstdm2f2c4qpprd82hduz9w2mvxjzrss4mmep00254jjzzlzgh9fkqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630322d8kpx</id>
    
      <title type="html">:locked: 1. Ephemeral Encrypted Volatile DVMs (for devices up to ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqstdm2f2c4qpprd82hduz9w2mvxjzrss4mmep00254jjzzlzgh9fkqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630322d8kpx" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfq3hk6w9jjv0mg7s3zd9dp0w2526u0wuvduj48k4d0yw8lwed9jsppemhxue69uhkummn9ekx7mp0jgvhtk&#39;&gt;nevent1q…vhtk&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;:locked: 1. Ephemeral Encrypted Volatile DVMs (for devices up to 16 GB RAM)&lt;br/&gt;&lt;br/&gt;Script deploys a systemd service that creates a fresh LUKS-encrypted LVM thin pool on every boot, clones all DVM templates into it as ephemeral -ephemeral variants, and completely destroys the pool - including all VM volumes, encryption keys, and the underlying image file - on shutdown. This guarantees that all DVM session data resides exclusively on encrypted volatile storage that is cryptographically irrecoverable after poweroff, leaving no forensic traces on disk.&lt;br/&gt;&lt;br/&gt;    This solution does not impose any additional memory load, which is critical for devices with less than 16 GB of RAM. My friends with 16 GB devices experienced severe issues when running DVMs entirely in RAM - DVMs would crash unexpectedly, or dom0 would start glitching: panel and app menu artifacts, cursor freezes.&lt;br/&gt;&lt;br/&gt;    Make sure there is sufficient free space (more than 4 GB) in dom0. You can resize dom0 these commands:&lt;br/&gt;&lt;br/&gt;sudo lvresize --size 4G /dev/mapper/qubes_dom0-root&lt;br/&gt;sudo resize2fs /dev/mapper/qubes_dom0-root&lt;br/&gt;sudo lvresize -L &#43;4G qubes_dom0/root-pool&lt;br/&gt;&lt;br/&gt;    Run this simple script in dom0 terminal:&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;sudo tee /etc/systemd/system/ephemeral-pool.service &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;[Unit]&lt;br/&gt;Description=Fresh ephemeral encrypted LVM pool with DVM auto-clone&lt;br/&gt;After=local-fs.target qubesd.service&lt;br/&gt;Requires=qubesd.service&lt;br/&gt;Before=qubes-vm@sys-net.service qubes-vm@sys-firewall.service&lt;br/&gt;&lt;br/&gt;[Service]&lt;br/&gt;Type=oneshot&lt;br/&gt;RemainAfterExit=yes&lt;br/&gt;ExecStartPre=-/usr/local/bin/ephemeral-pool-destroy.sh&lt;br/&gt;ExecStart=/usr/local/bin/ephemeral-pool-create.sh&lt;br/&gt;ExecStop=/usr/local/bin/ephemeral-pool-destroy.sh&lt;br/&gt;&lt;br/&gt;[Install]&lt;br/&gt;WantedBy=multi-user.target&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo tee /usr/local/bin/ephemeral-pool-create.sh &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;set -uo pipefail&lt;br/&gt;&lt;br/&gt;POOL_NAME=&amp;#34;ephemeral_pool&amp;#34;&lt;br/&gt;MOUNT_BASE=&amp;#34;/var/tmp/ephemeral&amp;#34;&lt;br/&gt;KEY_FILE=&amp;#34;/dev/shm/ephemeral.key&amp;#34;&lt;br/&gt;IMG_FILE=&amp;#34;${MOUNT_BASE}/pool.img&amp;#34;&lt;br/&gt;LUKS_NAME=&amp;#34;ephemeral_crypt&amp;#34;&lt;br/&gt;POOL_SIZE=&amp;#34;4G&amp;#34;&lt;br/&gt;&lt;br/&gt;ROOT_DEV=$(findmnt -n -o SOURCE / 2&amp;gt;/dev/null || echo &amp;#34;&amp;#34;)&lt;br/&gt;&lt;br/&gt;if echo &amp;#34;$ROOT_DEV&amp;#34; | grep -qE &amp;#34;(overlay|/dev/zram0)&amp;#34;; then&lt;br/&gt;    echo &amp;#34;[*] Detected amnesiac mode: $ROOT_DEV&amp;#34;&lt;br/&gt;    echo &amp;#34;    Destroying old ephemeral VMs and artifacts...&amp;#34;&lt;br/&gt;&lt;br/&gt;    for vm in $(qvm-ls --raw-list --running 2&amp;gt;/dev/null); do&lt;br/&gt;        if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;            echo &amp;#34;    -&amp;gt; Stopping: $vm&amp;#34;&lt;br/&gt;            qvm-shutdown --wait --timeout 10 &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || \&lt;br/&gt;                qvm-kill &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        fi&lt;br/&gt;    done&lt;br/&gt;&lt;br/&gt;    for vm in $(qvm-ls --raw-list 2&amp;gt;/dev/null); do&lt;br/&gt;        if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;            echo &amp;#34;    -&amp;gt; Removing VM: $vm&amp;#34;&lt;br/&gt;            qvm-remove --force &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        fi&lt;br/&gt;    done&lt;br/&gt;&lt;br/&gt;    qvm-pool remove &amp;#34;${POOL_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    vgchange -an ephemeral_vg 2&amp;gt;/dev/null || true&lt;br/&gt;    vgremove -f ephemeral_vg 2&amp;gt;/dev/null || true&lt;br/&gt;    cryptsetup close &amp;#34;${LUKS_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    rm -f &amp;#34;${KEY_FILE}&amp;#34; &amp;#34;${IMG_FILE}&amp;#34;&lt;br/&gt;&lt;br/&gt;    echo &amp;#34;[&#43;] Cleanup completed. Pool creation skipped in amnesiac mode.&amp;#34;&lt;br/&gt;    exit 0&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;for vm in $(qvm-ls --raw-list 2&amp;gt;/dev/null); do&lt;br/&gt;    if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;        echo &amp;#34;    -&amp;gt; Removing VM: $vm&amp;#34;&lt;br/&gt;        qvm-kill &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        sleep 1&lt;br/&gt;        qvm-remove --force &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        sleep 1&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;qvm-pool remove &amp;#34;${POOL_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;sleep 1&lt;br/&gt;vgchange -an ephemeral_vg 2&amp;gt;/dev/null || true&lt;br/&gt;vgremove -f ephemeral_vg 2&amp;gt;/dev/null || true&lt;br/&gt;cryptsetup close &amp;#34;${LUKS_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;rm -f &amp;#34;${KEY_FILE}&amp;#34; &amp;#34;${IMG_FILE}&amp;#34;&lt;br/&gt;&lt;br/&gt;mkdir -p &amp;#34;${MOUNT_BASE}&amp;#34;&lt;br/&gt;install -m600 /dev/null &amp;#34;${KEY_FILE}&amp;#34; &amp;amp;&amp;amp; dd if=/dev/urandom bs=1 count=4096 of=&amp;#34;${KEY_FILE}&amp;#34; iflag=fullblock&lt;br/&gt;truncate -s &amp;#34;${POOL_SIZE}&amp;#34; &amp;#34;${IMG_FILE}&amp;#34;&lt;br/&gt;LOOP_DEV=$(losetup -f --show &amp;#34;${IMG_FILE}&amp;#34;)&lt;br/&gt;cryptsetup luksFormat -q --key-file &amp;#34;${KEY_FILE}&amp;#34; &amp;#34;${LOOP_DEV}&amp;#34;&lt;br/&gt;cryptsetup open --key-file &amp;#34;${KEY_FILE}&amp;#34; &amp;#34;${LOOP_DEV}&amp;#34; &amp;#34;${LUKS_NAME}&amp;#34;&lt;br/&gt;pvcreate &amp;#34;/dev/mapper/${LUKS_NAME}&amp;#34;&lt;br/&gt;vgcreate &amp;#34;ephemeral_vg&amp;#34; &amp;#34;/dev/mapper/${LUKS_NAME}&amp;#34;&lt;br/&gt;lvcreate -T -n &amp;#34;thin_pool&amp;#34; -l &#43;100%FREE &amp;#34;ephemeral_vg&amp;#34;&lt;br/&gt;losetup -d &amp;#34;${LOOP_DEV}&amp;#34; || true&lt;br/&gt;&lt;br/&gt;if qvm-pool list 2&amp;gt;/dev/null | grep -q &amp;#34;^${POOL_NAME}&amp;#34;; then&lt;br/&gt;    qvm-pool remove &amp;#34;${POOL_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    sleep 1&lt;br/&gt;fi&lt;br/&gt;qvm-pool add &amp;#34;${POOL_NAME}&amp;#34; lvm_thin --option volume_group=ephemeral_vg --option thin_pool=thin_pool 2&amp;gt;/dev/null || \&lt;br/&gt;qvm-pool add &amp;#34;${POOL_NAME}&amp;#34; lvm_thin -o volume_group=ephemeral_vg,thin_pool=thin_pool&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Copying DVM templates...&amp;#34;&lt;br/&gt;qvm-ls --raw-list 2&amp;gt;/dev/null | grep -i &amp;#39;dvm&amp;#39; | grep -v &amp;#39;\-ephemeral$&amp;#39; | while read vm; do&lt;br/&gt;    [ -n &amp;#34;$vm&amp;#34; ] || continue&lt;br/&gt;    clone_name=&amp;#34;${vm}-ephemeral&amp;#34;&lt;br/&gt;    qvm-check -q &amp;#34;$clone_name&amp;#34; 2&amp;gt;/dev/null &amp;amp;&amp;amp; {&lt;br/&gt;        qvm-kill &amp;#34;$clone_name&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        qvm-remove --force &amp;#34;$clone_name&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    }&lt;br/&gt;    echo &amp;#34;    -&amp;gt; $vm -&amp;gt; ${clone_name}&amp;#34;&lt;br/&gt;    qvm-clone -P &amp;#34;${POOL_NAME}&amp;#34; &amp;#34;$vm&amp;#34; &amp;#34;$clone_name&amp;#34; &amp;amp;&amp;amp; {&lt;br/&gt;        qvm-prefs &amp;#34;$clone_name&amp;#34; template_for_dispvms True 2&amp;gt;/dev/null || true&lt;br/&gt;        qvm-prefs &amp;#34;$clone_name&amp;#34; autostart False 2&amp;gt;/dev/null || true&lt;br/&gt;    }&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[&#43;] Done!&amp;#34;&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo tee /usr/local/bin/ephemeral-pool-destroy.sh &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;set -uo pipefail&lt;br/&gt;&lt;br/&gt;POOL_NAME=&amp;#34;ephemeral_pool&amp;#34;&lt;br/&gt;LUKS_NAME=&amp;#34;ephemeral_crypt&amp;#34;&lt;br/&gt;KEY_FILE=&amp;#34;/dev/shm/ephemeral.key&amp;#34;&lt;br/&gt;IMG_FILE=&amp;#34;/var/tmp/ephemeral/pool.img&amp;#34;&lt;br/&gt;&lt;br/&gt;for vm in $(qvm-ls --raw-list 2&amp;gt;/dev/null); do&lt;br/&gt;    if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;        qvm-kill &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        sleep 1&lt;br/&gt;        qvm-remove --force &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        sleep 1&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;qvm-pool remove &amp;#34;${POOL_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;sleep 1&lt;br/&gt;qvm-pool remove &amp;#34;${POOL_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;vgchange -an ephemeral_vg 2&amp;gt;/dev/null || true&lt;br/&gt;vgremove -f ephemeral_vg 2&amp;gt;/dev/null || true&lt;br/&gt;cryptsetup close &amp;#34;${LUKS_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;for loop in $(losetup -j &amp;#34;${IMG_FILE}&amp;#34; 2&amp;gt;/dev/null | cut -d: -f1 || true); do&lt;br/&gt;    [ -n &amp;#34;$loop&amp;#34; ] &amp;amp;&amp;amp; losetup -d &amp;#34;$loop&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;done&lt;br/&gt;rm -f &amp;#34;${KEY_FILE}&amp;#34; &amp;#34;${IMG_FILE}&amp;#34;&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo chmod &#43;x /usr/local/bin/ephemeral-pool-create.sh&lt;br/&gt;sudo chmod &#43;x /usr/local/bin/ephemeral-pool-destroy.sh&lt;br/&gt;sudo systemctl daemon-reload&lt;br/&gt;sudo systemctl enable --now ephemeral-pool.service&lt;br/&gt;&lt;br/&gt;    To remove pool and disable the systemd service:&lt;br/&gt;&lt;br/&gt;sudo systemctl stop ephemeral-pool.service&lt;br/&gt;sudo systemctl disable ephemeral-pool.service&lt;br/&gt;&lt;br/&gt;    Start the service and pool again:&lt;br/&gt;&lt;br/&gt;sudo systemctl enable --now ephemeral-pool.service&lt;br/&gt;&lt;br/&gt;:card_index_dividers: 2. RAM-based DVMs on a Zram disk (for devices with 20-24 GB of RAM)&lt;br/&gt;&lt;br/&gt;This script creates a compressed RAM disk (zram) that acts as a super-fast ephemeral storage pool for your DVMs. On every boot, it sets aside a portion of your RAM - compressed with lz4 algorithm to save space - builds an LVM thin pool on top of it, and clones all your DVM templates there as -ephemeral variants. When you shut down the system, everything in that RAM disk vanishes instantly without ever touching your physical disk. The key advantage of zram is built-in compression: your 3 GB pool can hold 6-7 GB of actual VM data, giving you more usable space than raw RAM would allow. It is also significantly faster than disk-based storage, so DVMs launch and run with near-native speed. Unlike tmpfs, zram does not compete with your system memory for cache.&lt;br/&gt;&lt;br/&gt;    First, increase the maximum dom0 memory in this file&lt;br/&gt;    sudo nano /etc/default/grub&lt;br/&gt;    edit this value dom0_mem=max:4096M to dom0_mem=max:6144M,&lt;br/&gt;    update GRUB sudo grub2-mkconfig -o /boot/grub2/grub.cfg and reboot Qubes OS.&lt;br/&gt;&lt;br/&gt;    Run this simple script in dom0 terminal:&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;sudo tee /etc/systemd/system/zram-pool.service &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;[Unit]&lt;br/&gt;Description=ZRAM Ephemeral Pool&lt;br/&gt;After=qubesd.service&lt;br/&gt;Before=qubes-vm@sys-net.service&lt;br/&gt;&lt;br/&gt;[Service]&lt;br/&gt;Type=oneshot&lt;br/&gt;ExecStart=/usr/local/bin/zram-pool-create.sh&lt;br/&gt;RemainAfterExit=yes&lt;br/&gt;&lt;br/&gt;[Install]&lt;br/&gt;WantedBy=multi-user.target&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo tee /usr/local/bin/zram-pool-create.sh &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;set -euo pipefail&lt;br/&gt;&lt;br/&gt;POOL_NAME=&amp;#34;zram_pool&amp;#34;&lt;br/&gt;ZRAM_SIZE=&amp;#34;4G&amp;#34;&lt;br/&gt;VG_NAME=&amp;#34;zram_vg&amp;#34;&lt;br/&gt;&lt;br/&gt;EXTRA_VMS=(&lt;br/&gt;    #&amp;#34;whonix&amp;#34;&lt;br/&gt;    #&amp;#34;sys-whonix&amp;#34;&lt;br/&gt;)&lt;br/&gt;&lt;br/&gt;ROOT_DEV=$(findmnt -n -o SOURCE / 2&amp;gt;/dev/null || echo &amp;#34;&amp;#34;)&lt;br/&gt;&lt;br/&gt;if echo &amp;#34;$ROOT_DEV&amp;#34; | grep -qE &amp;#34;(overlay|/dev/zram0)&amp;#34;; then&lt;br/&gt;    echo &amp;#34;[*] Detected amnesiac mode: $ROOT_DEV&amp;#34;&lt;br/&gt;    echo &amp;#34;    Cleaning up old VMs...&amp;#34;&lt;br/&gt;&lt;br/&gt;    for vm in $(qvm-ls --raw-list --running 2&amp;gt;/dev/null); do&lt;br/&gt;        if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;            echo &amp;#34;    -&amp;gt; Stopping: $vm&amp;#34;&lt;br/&gt;            qvm-shutdown --wait --timeout 10 &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || \&lt;br/&gt;                qvm-kill &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        fi&lt;br/&gt;    done&lt;br/&gt;&lt;br/&gt;    for vm in $(qvm-ls --raw-list 2&amp;gt;/dev/null); do&lt;br/&gt;        if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;            echo &amp;#34;    -&amp;gt; Removing: $vm&amp;#34;&lt;br/&gt;            qvm-remove --force &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        fi&lt;br/&gt;    done&lt;br/&gt;&lt;br/&gt;    qvm-pool remove &amp;#34;${POOL_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    vgchange -an &amp;#34;${VG_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    vgremove -f &amp;#34;${VG_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;    for dev in /dev/zram*; do&lt;br/&gt;        [ -b &amp;#34;$dev&amp;#34; ] || continue&lt;br/&gt;        zramctl --reset &amp;#34;$dev&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    done&lt;br/&gt;&lt;br/&gt;    echo &amp;#34;[&#43;] Cleanup completed.&amp;#34;&lt;br/&gt;    exit 0&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;if [ &amp;#34;$EUID&amp;#34; -ne 0 ]; then&lt;br/&gt;    echo &amp;#34;[!] Root privileges required&amp;#34;&lt;br/&gt;    exit 1&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Creating zram device (${ZRAM_SIZE})...&amp;#34;&lt;br/&gt;modprobe zram 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;ZRAM_DEV=&amp;#34;&amp;#34;&lt;br/&gt;for dev in /dev/zram*; do&lt;br/&gt;    [ -b &amp;#34;$dev&amp;#34; ] || continue&lt;br/&gt;    if ! zramctl &amp;#34;$dev&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;mounted\|active&amp;#34;; then&lt;br/&gt;        ZRAM_DEV=&amp;#34;$dev&amp;#34;&lt;br/&gt;        break&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;if [ -z &amp;#34;$ZRAM_DEV&amp;#34; ]; then&lt;br/&gt;    ZRAM_DEV=$(zramctl --find --size &amp;#34;$ZRAM_SIZE&amp;#34; --algorithm lz4)&lt;br/&gt;else&lt;br/&gt;    zramctl --reset &amp;#34;$ZRAM_DEV&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    ZRAM_DEV=$(zramctl --find --size &amp;#34;$ZRAM_SIZE&amp;#34; --algorithm lz4)&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;echo &amp;#34;    Device: $ZRAM_DEV&amp;#34;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Removing VMs from pool ${POOL_NAME}...&amp;#34;&lt;br/&gt;for vm in $(qvm-ls --raw-list --running 2&amp;gt;/dev/null); do&lt;br/&gt;    if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;        echo &amp;#34;    -&amp;gt; Stopping: $vm&amp;#34;&lt;br/&gt;        qvm-shutdown --wait --timeout 30 &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || {&lt;br/&gt;            echo &amp;#34;    -&amp;gt; Force killing: $vm&amp;#34;&lt;br/&gt;            qvm-kill &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        }&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;for vm in $(qvm-ls --raw-list 2&amp;gt;/dev/null); do&lt;br/&gt;    if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;        echo &amp;#34;    -&amp;gt; Removing: $vm&amp;#34;&lt;br/&gt;        qvm-remove --force &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Cleaning up old infrastructure...&amp;#34;&lt;br/&gt;qvm-pool remove &amp;#34;${POOL_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;vgchange -an &amp;#34;${VG_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;vgremove -f &amp;#34;${VG_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;# Detach old loops on zram&lt;br/&gt;for loopdev in $(losetup -a 2&amp;gt;/dev/null | grep &amp;#34;$ZRAM_DEV&amp;#34; | cut -d: -f1); do&lt;br/&gt;    echo &amp;#34;    -&amp;gt; Detaching loop: $loopdev&amp;#34;&lt;br/&gt;    losetup -d &amp;#34;$loopdev&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Creating loop on ${ZRAM_DEV}...&amp;#34;&lt;br/&gt;LOOP_DEV=$(losetup -f --show &amp;#34;$ZRAM_DEV&amp;#34;)&lt;br/&gt;echo &amp;#34;    Loop: $LOOP_DEV&amp;#34;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Creating LVM on ${LOOP_DEV}...&amp;#34;&lt;br/&gt;pvcreate -q &amp;#34;$LOOP_DEV&amp;#34;&lt;br/&gt;vgcreate -q &amp;#34;${VG_NAME}&amp;#34; &amp;#34;$LOOP_DEV&amp;#34;&lt;br/&gt;lvcreate -q -T -n &amp;#34;thin_pool&amp;#34; -l &#43;100%FREE &amp;#34;${VG_NAME}&amp;#34;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Registering pool ${POOL_NAME}...&amp;#34;&lt;br/&gt;if qvm-pool list 2&amp;gt;/dev/null | grep -q &amp;#34;^${POOL_NAME}&amp;#34;; then&lt;br/&gt;    qvm-pool remove &amp;#34;${POOL_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    sleep 1&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;qvm-pool add &amp;#34;${POOL_NAME}&amp;#34; lvm_thin --option volume_group=&amp;#34;${VG_NAME}&amp;#34; --option thin_pool=thin_pool 2&amp;gt;/dev/null || \&lt;br/&gt;qvm-pool add &amp;#34;${POOL_NAME}&amp;#34; lvm_thin -o volume_group=&amp;#34;${VG_NAME}&amp;#34;,thin_pool=thin_pool&lt;br/&gt;&lt;br/&gt;echo &amp;#34;    Pool created:&amp;#34;&lt;br/&gt;qvm-pool info &amp;#34;${POOL_NAME}&amp;#34;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Cloning VMs into ephemeral pool...&amp;#34;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;    [DVM templates]&amp;#34;&lt;br/&gt;qvm-ls --raw-list 2&amp;gt;/dev/null | while read -r vm; do&lt;br/&gt;    [ -n &amp;#34;$vm&amp;#34; ] || continue&lt;br/&gt;&lt;br/&gt;    is_dvm=$(qvm-prefs &amp;#34;$vm&amp;#34; template_for_dispvms 2&amp;gt;/dev/null || echo &amp;#34;False&amp;#34;)&lt;br/&gt;    [ &amp;#34;$is_dvm&amp;#34; = &amp;#34;True&amp;#34; ] || continue&lt;br/&gt;&lt;br/&gt;    if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;        continue&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    clone_name=&amp;#34;${vm}-ephemeral&amp;#34;&lt;br/&gt;&lt;br/&gt;    if qvm-ls --raw-list 2&amp;gt;/dev/null | grep -q &amp;#34;^${clone_name}$&amp;#34;; then&lt;br/&gt;        echo &amp;#34;    -&amp;gt; Removing old copy: ${clone_name}&amp;#34;&lt;br/&gt;        qvm-kill &amp;#34;$clone_name&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        qvm-remove --force &amp;#34;$clone_name&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    echo &amp;#34;    -&amp;gt; Cloning: $vm -&amp;gt; ${clone_name}&amp;#34;&lt;br/&gt;&lt;br/&gt;    if qvm-clone -P &amp;#34;${POOL_NAME}&amp;#34; &amp;#34;$vm&amp;#34; &amp;#34;$clone_name&amp;#34;; then&lt;br/&gt;        qvm-prefs &amp;#34;$clone_name&amp;#34; template_for_dispvms True 2&amp;gt;/dev/null || true&lt;br/&gt;        qvm-prefs &amp;#34;$clone_name&amp;#34; autostart False 2&amp;gt;/dev/null || true&lt;br/&gt;        echo &amp;#34;    [&#43;] OK&amp;#34;&lt;br/&gt;    else&lt;br/&gt;        echo &amp;#34;    [!] ERROR&amp;#34;&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;if [ ${#EXTRA_VMS[@]} -gt 0 ]; then&lt;br/&gt;    echo &amp;#34;    [Extra VMs]&amp;#34;&lt;br/&gt;    for vm in &amp;#34;${EXTRA_VMS[@]}&amp;#34;; do&lt;br/&gt;        if ! qvm-ls --raw-list 2&amp;gt;/dev/null | grep -q &amp;#34;^${vm}$&amp;#34;; then&lt;br/&gt;            echo &amp;#34;    [!] VM not found: $vm&amp;#34;&lt;br/&gt;            continue&lt;br/&gt;        fi&lt;br/&gt;&lt;br/&gt;        if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;            echo &amp;#34;    -&amp;gt; Skipping (already in zram): $vm&amp;#34;&lt;br/&gt;            continue&lt;br/&gt;        fi&lt;br/&gt;&lt;br/&gt;        clone_name=&amp;#34;${vm}-ephemeral&amp;#34;&lt;br/&gt;&lt;br/&gt;        if qvm-ls --raw-list 2&amp;gt;/dev/null | grep -q &amp;#34;^${clone_name}$&amp;#34;; then&lt;br/&gt;            echo &amp;#34;    -&amp;gt; Removing old copy: ${clone_name}&amp;#34;&lt;br/&gt;            qvm-kill &amp;#34;$clone_name&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;            qvm-remove --force &amp;#34;$clone_name&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        fi&lt;br/&gt;&lt;br/&gt;        echo &amp;#34;    -&amp;gt; Cloning: $vm -&amp;gt; ${clone_name}&amp;#34;&lt;br/&gt;&lt;br/&gt;        if qvm-clone -P &amp;#34;${POOL_NAME}&amp;#34; &amp;#34;$vm&amp;#34; &amp;#34;$clone_name&amp;#34;; then&lt;br/&gt;            qvm-prefs &amp;#34;$clone_name&amp;#34; template_for_dispvms False 2&amp;gt;/dev/null || true&lt;br/&gt;            qvm-prefs &amp;#34;$clone_name&amp;#34; autostart False 2&amp;gt;/dev/null || true&lt;br/&gt;            echo &amp;#34;    [&#43;] OK&amp;#34;&lt;br/&gt;        else&lt;br/&gt;            echo &amp;#34;    [!] ERROR&amp;#34;&lt;br/&gt;        fi&lt;br/&gt;    done&lt;br/&gt;fi&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo chmod &#43;x /usr/local/bin/zram-pool-create.sh&lt;br/&gt;sudo systemctl daemon-reload&lt;br/&gt;sudo systemctl enable --now zram-pool.service&lt;br/&gt;&lt;br/&gt;    To remove zram pool and disable the systemd service run this script:&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;# Step 1: Stop and disable the systemd service&lt;br/&gt;sudo systemctl stop zram-pool.service&lt;br/&gt;sudo systemctl disable zram-pool.service&lt;br/&gt;&lt;br/&gt;# Step 2: Remove all VMs from zram_pool&lt;br/&gt;echo &amp;#34;[*] Removing VMs from zram_pool...&amp;#34;&lt;br/&gt;for vm in $(qvm-ls --raw-list 2&amp;gt;/dev/null); do&lt;br/&gt;    if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;zram_pool&amp;#34;; then&lt;br/&gt;        echo &amp;#34;    -&amp;gt; Removing: $vm&amp;#34;&lt;br/&gt;        qvm-kill &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        sleep 1&lt;br/&gt;        qvm-remove --force &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        sleep 1&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;# Step 3: Remove the Qubes storage pool&lt;br/&gt;echo &amp;#34;[*] Removing zram_pool...&amp;#34;&lt;br/&gt;qvm-pool remove zram_pool 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;# Step 4: Deactivate and remove LVM volume group&lt;br/&gt;echo &amp;#34;[*] Cleaning up LVM...&amp;#34;&lt;br/&gt;vgchange -an zram_vg 2&amp;gt;/dev/null || true&lt;br/&gt;vgremove -f zram_vg 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;# Step 5: Detach loop device from zram&lt;br/&gt;echo &amp;#34;[*] Detaching loop devices...&amp;#34;&lt;br/&gt;for loopdev in $(losetup -a 2&amp;gt;/dev/null | grep &amp;#34;/dev/zram&amp;#34; | cut -d: -f1); do&lt;br/&gt;    echo &amp;#34;    -&amp;gt; Detaching: $loopdev&amp;#34;&lt;br/&gt;    losetup -d &amp;#34;$loopdev&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;# Step 6: Reset zram device&lt;br/&gt;echo &amp;#34;[*] Resetting zram device...&amp;#34;&lt;br/&gt;for dev in /dev/zram*; do&lt;br/&gt;    [ -b &amp;#34;$dev&amp;#34; ] || continue&lt;br/&gt;    zramctl --reset &amp;#34;$dev&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[&#43;] zram pool completely removed. Reboot to clear all traces from memory.&amp;#34;&lt;br/&gt;&lt;br/&gt;    Start the service and pool again:&lt;br/&gt;&lt;br/&gt;sudo systemctl enable --now zram-pool.service&lt;br/&gt;&lt;br/&gt;:tornado: 3. RAM-based DVMs on TMPFS (for devices with 32 GB of RAM)&lt;br/&gt;&lt;br/&gt;This variant creates a pure RAM-based ephemeral pool using tmpfs. On every boot, it allocates a portion of your system memory as a temporary filesystem, builds an LVM thin pool inside it, and clones all your DVM templates there as ephemeral variants. When you shut down or reboot, the entire pool and all its VMs vanish instantly. Direct RAM access means DVMs launch faster than any other storage type. No encryption overhead, no zram compression delays or disk I/O bottlenecks - just RAM and LVM. The entire pool size is reserved from RAM immediately, making this best suited for systems with 32 GB or more.&lt;br/&gt;&lt;br/&gt;    First, increase the maximum dom0 memory in this file&lt;br/&gt;    sudo nano /etc/default/grub&lt;br/&gt;    edit this value dom0_mem=max:4096M to dom0_mem=max:8192M,&lt;br/&gt;    update GRUB sudo grub2-mkconfig -o /boot/grub2/grub.cfg and reboot Qubes OS.&lt;br/&gt;&lt;br/&gt;    Run this simple script in dom0 terminal:&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;sudo tee /etc/systemd/system/tmpfs-pool.service &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;[Unit]&lt;br/&gt;Description=TMPFS Ephemeral Pool&lt;br/&gt;After=qubesd.service&lt;br/&gt;Before=qubes-vm@sys-net.service&lt;br/&gt;&lt;br/&gt;[Service]&lt;br/&gt;Type=oneshot&lt;br/&gt;ExecStart=/usr/local/bin/tmpfs-pool-create.sh&lt;br/&gt;RemainAfterExit=yes&lt;br/&gt;&lt;br/&gt;[Install]&lt;br/&gt;WantedBy=multi-user.target&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo tee /usr/local/bin/tmpfs-pool-create.sh &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;set -uo pipefail&lt;br/&gt;&lt;br/&gt;POOL_NAME=&amp;#34;tmpfs_pool&amp;#34;&lt;br/&gt;MOUNT_BASE=&amp;#34;/dev/shm/ephemeral&amp;#34;&lt;br/&gt;IMG_FILE=&amp;#34;${MOUNT_BASE}/pool.img&amp;#34;&lt;br/&gt;POOL_SIZE=&amp;#34;4G&amp;#34;&lt;br/&gt;VG_NAME=&amp;#34;ephemeral_vg&amp;#34;&lt;br/&gt;&lt;br/&gt;ROOT_DEV=$(findmnt -n -o SOURCE / 2&amp;gt;/dev/null || echo &amp;#34;&amp;#34;)&lt;br/&gt;&lt;br/&gt;if echo &amp;#34;$ROOT_DEV&amp;#34; | grep -qE &amp;#34;(overlay|/dev/zram)&amp;#34;; then&lt;br/&gt;    echo &amp;#34;[*] Detected amnesiac mode: $ROOT_DEV&amp;#34;&lt;br/&gt;    echo &amp;#34;    Destroying old ephemeral VMs and artifacts...&amp;#34;&lt;br/&gt;&lt;br/&gt;    for vm in $(qvm-ls --raw-list --running 2&amp;gt;/dev/null); do&lt;br/&gt;        if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;            echo &amp;#34;    -&amp;gt; Stopping: $vm&amp;#34;&lt;br/&gt;            qvm-shutdown --wait --timeout 10 &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || \&lt;br/&gt;                qvm-kill &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        fi&lt;br/&gt;    done&lt;br/&gt;&lt;br/&gt;    for vm in $(qvm-ls --raw-list 2&amp;gt;/dev/null); do&lt;br/&gt;        if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;            echo &amp;#34;    -&amp;gt; Removing: $vm&amp;#34;&lt;br/&gt;            qvm-remove --force &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        fi&lt;br/&gt;    done&lt;br/&gt;&lt;br/&gt;    qvm-pool remove &amp;#34;${POOL_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    vgchange -an &amp;#34;${VG_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    vgremove -f &amp;#34;${VG_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    rm -rf &amp;#34;${MOUNT_BASE}&amp;#34;&lt;br/&gt;&lt;br/&gt;    echo &amp;#34;[&#43;] Cleanup completed. Pool creation skipped in amnesiac mode.&amp;#34;&lt;br/&gt;    exit 0&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Phase 1: Removing ALL VMs from ephemeral pool...&amp;#34;&lt;br/&gt;&lt;br/&gt;for vm in $(qvm-ls --raw-list 2&amp;gt;/dev/null); do&lt;br/&gt;    if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;        echo &amp;#34;    -&amp;gt; Removing VM: $vm&amp;#34;&lt;br/&gt;        qvm-kill &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        sleep 1&lt;br/&gt;        qvm-remove --force &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        sleep 1&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;# Pool in RAM — simply delete files&lt;br/&gt;echo &amp;#34;[*] Phase 2: Cleaning old pool from RAM...&amp;#34;&lt;br/&gt;&lt;br/&gt;qvm-pool remove &amp;#34;${POOL_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;vgchange -an &amp;#34;${VG_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;vgremove -f &amp;#34;${VG_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;# Remove old files (if any remain)&lt;br/&gt;rm -rf &amp;#34;${MOUNT_BASE}&amp;#34;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Phase 3: Creating fresh ephemeral pool in RAM...&amp;#34;&lt;br/&gt;&lt;br/&gt;mkdir -p &amp;#34;${MOUNT_BASE}&amp;#34;&lt;br/&gt;&lt;br/&gt;# New image in RAM&lt;br/&gt;truncate -s &amp;#34;${POOL_SIZE}&amp;#34; &amp;#34;${IMG_FILE}&amp;#34;&lt;br/&gt;&lt;br/&gt;# Loop device&lt;br/&gt;LOOP_DEV=$(losetup -f --show &amp;#34;${IMG_FILE}&amp;#34;)&lt;br/&gt;&lt;br/&gt;# LVM thin pool directly on loop (no encryption)&lt;br/&gt;pvcreate &amp;#34;$LOOP_DEV&amp;#34;&lt;br/&gt;vgcreate &amp;#34;${VG_NAME}&amp;#34; &amp;#34;$LOOP_DEV&amp;#34;&lt;br/&gt;lvcreate -T -n &amp;#34;thin_pool&amp;#34; -l &#43;100%FREE &amp;#34;${VG_NAME}&amp;#34;&lt;br/&gt;&lt;br/&gt;# Detach loop&lt;br/&gt;losetup -d &amp;#34;${LOOP_DEV}&amp;#34; || true&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Phase 4: Registering pool...&amp;#34;&lt;br/&gt;&lt;br/&gt;if qvm-pool list 2&amp;gt;/dev/null | grep -q &amp;#34;^${POOL_NAME}&amp;#34;; then&lt;br/&gt;    qvm-pool remove &amp;#34;${POOL_NAME}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    sleep 1&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;qvm-pool add &amp;#34;${POOL_NAME}&amp;#34; lvm_thin --option volume_group=&amp;#34;${VG_NAME}&amp;#34; --option thin_pool=thin_pool 2&amp;gt;/dev/null || \&lt;br/&gt;qvm-pool add &amp;#34;${POOL_NAME}&amp;#34; lvm_thin -o volume_group=&amp;#34;${VG_NAME}&amp;#34;,thin_pool=thin_pool&lt;br/&gt;&lt;br/&gt;if ! qvm-pool list 2&amp;gt;/dev/null | grep -q &amp;#34;^${POOL_NAME}&amp;#34;; then&lt;br/&gt;    echo &amp;#34;[!] Pool registration failed&amp;#34;&lt;br/&gt;    exit 1&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[&#43;] Pool ready in RAM&amp;#34;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Phase 5: Copying DVM templates...&amp;#34;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;    [DVM templates]&amp;#34;&lt;br/&gt;qvm-ls --raw-list 2&amp;gt;/dev/null | while read -r vm; do&lt;br/&gt;    [ -n &amp;#34;$vm&amp;#34; ] || continue&lt;br/&gt;&lt;br/&gt;    is_dvm=$(qvm-prefs &amp;#34;$vm&amp;#34; template_for_dispvms 2&amp;gt;/dev/null || echo &amp;#34;False&amp;#34;)&lt;br/&gt;    [ &amp;#34;$is_dvm&amp;#34; = &amp;#34;True&amp;#34; ] || continue&lt;br/&gt;&lt;br/&gt;    if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;        continue&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    clone_name=&amp;#34;${vm}-ephemeral&amp;#34;&lt;br/&gt;&lt;br/&gt;    if qvm-ls --raw-list 2&amp;gt;/dev/null | grep -q &amp;#34;^${clone_name}$&amp;#34;; then&lt;br/&gt;        echo &amp;#34;    -&amp;gt; Removing old copy: ${clone_name}&amp;#34;&lt;br/&gt;        qvm-kill &amp;#34;$clone_name&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        qvm-remove --force &amp;#34;$clone_name&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    echo &amp;#34;    -&amp;gt; Cloning: $vm -&amp;gt; ${clone_name}&amp;#34;&lt;br/&gt;&lt;br/&gt;    if qvm-clone -P &amp;#34;${POOL_NAME}&amp;#34; &amp;#34;$vm&amp;#34; &amp;#34;$clone_name&amp;#34;; then&lt;br/&gt;        qvm-prefs &amp;#34;$clone_name&amp;#34; template_for_dispvms True 2&amp;gt;/dev/null || true&lt;br/&gt;        qvm-prefs &amp;#34;$clone_name&amp;#34; autostart False 2&amp;gt;/dev/null || true&lt;br/&gt;        echo &amp;#34;    [&#43;] OK&amp;#34;&lt;br/&gt;    else&lt;br/&gt;        echo &amp;#34;    [!] ERROR&amp;#34;&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[&#43;] Done!&amp;#34;&lt;br/&gt;echo &amp;#34;&amp;#34;&lt;br/&gt;echo &amp;#34;VMs in ephemeral pool:&amp;#34;&lt;br/&gt;for vm in $(qvm-ls --raw-list 2&amp;gt;/dev/null); do&lt;br/&gt;    if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;        echo &amp;#34;  - $vm&amp;#34;&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo chmod &#43;x /usr/local/bin/tmpfs-pool-create.sh&lt;br/&gt;sudo systemctl daemon-reload&lt;br/&gt;sudo systemctl enable --now tmpfs-pool.service&lt;br/&gt;&lt;br/&gt;    To remove zram pool and disable the systemd service run this script:&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;# Step 1: Stop the service (prevents auto-restart on boot)&lt;br/&gt;sudo systemctl stop tmpfs-pool.service&lt;br/&gt;sudo systemctl disable tmpfs-pool.service&lt;br/&gt;&lt;br/&gt;# Step 2: Remove all VMs from tmpfs_pool&lt;br/&gt;echo &amp;#34;[*] Removing VMs from tmpfs_pool...&amp;#34;&lt;br/&gt;for vm in $(qvm-ls --raw-list 2&amp;gt;/dev/null); do&lt;br/&gt;    if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;tmpfs_pool&amp;#34;; then&lt;br/&gt;        echo &amp;#34;    -&amp;gt; Removing: $vm&amp;#34;&lt;br/&gt;        qvm-kill &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        sleep 1&lt;br/&gt;        qvm-remove --force &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        sleep 1&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;# Step 3: Remove the Qubes storage pool&lt;br/&gt;echo &amp;#34;[*] Removing tmpfs_pool...&amp;#34;&lt;br/&gt;qvm-pool remove tmpfs_pool 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;# Step 4: Clean up LVM&lt;br/&gt;echo &amp;#34;[*] Cleaning up LVM...&amp;#34;&lt;br/&gt;vgchange -an ephemeral_vg 2&amp;gt;/dev/null || true&lt;br/&gt;vgremove -f ephemeral_vg 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;# Step 5: Free RAM by removing the image&lt;br/&gt;echo &amp;#34;[*] Freeing RAM...&amp;#34;&lt;br/&gt;rm -rf /dev/shm/ephemeral&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[&#43;] tmpfs pool stopped and cleaned up.&amp;#34;&lt;br/&gt;&lt;br/&gt;    Start the service and pool again:&lt;br/&gt;&lt;br/&gt;sudo systemctl enable --now tmpfs-pool.service&lt;br/&gt;&lt;br/&gt;:gear: 4. Modifying default DVMs&lt;br/&gt;&lt;br/&gt;This solution is for those who want to configure the default DVMs for amnesic operation - without creating new pools or new DVMs.&lt;br/&gt;&lt;br/&gt;    Сreate a systemd service that remounts the root in the DVM as an ephemeral encrypted volatile volume:&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;sudo tee /etc/systemd/system/dvm-root.service &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;[Unit]&lt;br/&gt;Description=DVM root rw False&lt;br/&gt;After=qubesd.service&lt;br/&gt;Requires=qubesd.service&lt;br/&gt;&lt;br/&gt;[Service]&lt;br/&gt;Type=oneshot&lt;br/&gt;RemainAfterExit=yes&lt;br/&gt;ExecStart=/usr/local/bin/dvm-root.sh&lt;br/&gt;&lt;br/&gt;[Install]&lt;br/&gt;WantedBy=multi-user.target&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo tee /usr/local/bin/dvm-root.sh &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;set -euo pipefail&lt;br/&gt;&lt;br/&gt;while read -r vm; do&lt;br/&gt;    [ -n &amp;#34;$vm&amp;#34; ] || continue&lt;br/&gt;    is_dvm=$(qvm-prefs &amp;#34;$vm&amp;#34; template_for_dispvms 2&amp;gt;/dev/null || echo &amp;#34;False&amp;#34;)&lt;br/&gt;    [ &amp;#34;$is_dvm&amp;#34; = &amp;#34;True&amp;#34; ] || continue&lt;br/&gt;    qvm-volume config &amp;#34;${vm}:root&amp;#34; rw false&lt;br/&gt;done &amp;lt; &amp;lt;(qvm-ls --raw-list)&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo chmod &#43;x /usr/local/bin/dvm-root.sh&lt;br/&gt;sudo systemctl daemon-reload&lt;br/&gt;sudo systemctl enable dvm-root.service&lt;br/&gt;qvm-pool set vm-pool -o ephemeral_volatile=True&lt;br/&gt;&lt;br/&gt;TMPFS Script for Debian/Fedora/Kicksecure-based DVM templates:&lt;br/&gt;&lt;br/&gt;OVERLAY_BASE=&amp;#34;/run/home-overlay&amp;#34;&lt;br/&gt;LOWERDIR=&amp;#34;/home&amp;#34;&lt;br/&gt;UPPERDIR=&amp;#34;$OVERLAY_BASE/upper&amp;#34;&lt;br/&gt;WORKDIR=&amp;#34;$OVERLAY_BASE/work&amp;#34;&lt;br/&gt;MOUNTPOINT=&amp;#34;/home&amp;#34;&lt;br/&gt;&lt;br/&gt;# Create directories&lt;br/&gt;mkdir -p &amp;#34;$UPPERDIR&amp;#34; &amp;#34;$WORKDIR&amp;#34;&lt;br/&gt;&lt;br/&gt;# Mount tmpfs for overlay upper&#43;work layers&lt;br/&gt;mount -t tmpfs -o size=2G,mode=0755 tmpfs &amp;#34;$OVERLAY_BASE&amp;#34;&lt;br/&gt;&lt;br/&gt;# Recreate upper/work inside tmpfs after mount&lt;br/&gt;mkdir -p &amp;#34;$UPPERDIR&amp;#34; &amp;#34;$WORKDIR&amp;#34;&lt;br/&gt;&lt;br/&gt;# Mount overlayfs&lt;br/&gt;mount -t overlay overlay \&lt;br/&gt;  -o lowerdir=&amp;#34;$LOWERDIR&amp;#34;,upperdir=&amp;#34;$UPPERDIR&amp;#34;,workdir=&amp;#34;$WORKDIR&amp;#34; \&lt;br/&gt;  &amp;#34;$MOUNTPOINT&amp;#34;&lt;br/&gt;&lt;br/&gt;Or alternative Script: Zram-disk for Debian/Fedora/Kicksecure-based DVM templates (If you want an overlay with memory compression - saves RAM, but adds slight CPU overhead):&lt;br/&gt;&lt;br/&gt;ZRAM_DEV=&amp;#34;&amp;#34;&lt;br/&gt;ZRAM_SIZE=&amp;#34;2G&amp;#34;&lt;br/&gt;LOWERDIR=&amp;#34;/home&amp;#34;&lt;br/&gt;OVERLAY_BASE=&amp;#34;/run/home-overlay&amp;#34;&lt;br/&gt;UPPERDIR=&amp;#34;$OVERLAY_BASE/upper&amp;#34;&lt;br/&gt;WORKDIR=&amp;#34;$OVERLAY_BASE/work&amp;#34;&lt;br/&gt;MOUNTPOINT=&amp;#34;/home&amp;#34;&lt;br/&gt;&lt;br/&gt;# --- 1. Create and configure zram device ---&lt;br/&gt;&lt;br/&gt;# Load zram module if not loaded&lt;br/&gt;if ! lsmod | grep -q &amp;#34;^zram&amp;#34;; then&lt;br/&gt;    modprobe zram num_devices=1 || modprobe zram&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# Wait for zram control interface&lt;br/&gt;for _ in {1..10}; do&lt;br/&gt;    if [ -d /sys/class/zram-control ]; then&lt;br/&gt;        break&lt;br/&gt;    fi&lt;br/&gt;    sleep 0.1&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;# Find first free zram device&lt;br/&gt;for i in /sys/block/zram*; do&lt;br/&gt;    [ -e &amp;#34;$i&amp;#34; ] || continue&lt;br/&gt;    if [ &amp;#34;$(cat &amp;#34;$i&amp;#34;/disksize)&amp;#34; = &amp;#34;0&amp;#34; ]; then&lt;br/&gt;        ZRAM_DEV=&amp;#34;/dev/$(basename &amp;#34;$i&amp;#34;)&amp;#34;&lt;br/&gt;        break&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;if [ -z &amp;#34;$ZRAM_DEV&amp;#34; ]; then&lt;br/&gt;    # No free device; try to add one via hot_add&lt;br/&gt;    if [ -f /sys/class/zram-control/hot_add ]; then&lt;br/&gt;        idx=$(cat /sys/class/zram-control/hot_add)&lt;br/&gt;        ZRAM_DEV=&amp;#34;/dev/zram$idx&amp;#34;&lt;br/&gt;    else&lt;br/&gt;        echo &amp;#34;ERROR: no free zram device found and hot_add not available&amp;#34; &amp;gt;&amp;amp;2&lt;br/&gt;        exit 1&lt;br/&gt;    fi&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;echo &amp;#34;Using $ZRAM_DEV&amp;#34;&lt;br/&gt;&lt;br/&gt;# Configure compression and size&lt;br/&gt;echo lz4 &amp;gt; /sys/block/$(basename &amp;#34;$ZRAM_DEV&amp;#34;)/comp_algorithm 2&amp;gt;/dev/null || true&lt;br/&gt;echo &amp;#34;$ZRAM_SIZE&amp;#34; &amp;gt; /sys/block/$(basename &amp;#34;$ZRAM_DEV&amp;#34;)/disksize&lt;br/&gt;&lt;br/&gt;# Format and mount zram as ext4 (needed for overlay upper&#43;work)&lt;br/&gt;mkfs.ext4 -q &amp;#34;$ZRAM_DEV&amp;#34;&lt;br/&gt;&lt;br/&gt;mkdir -p &amp;#34;$OVERLAY_BASE&amp;#34;&lt;br/&gt;mount -t ext4 &amp;#34;$ZRAM_DEV&amp;#34; &amp;#34;$OVERLAY_BASE&amp;#34;&lt;br/&gt;&lt;br/&gt;# --- 2. Prepare overlay directories ---&lt;br/&gt;&lt;br/&gt;mkdir -p &amp;#34;$UPPERDIR&amp;#34; &amp;#34;$WORKDIR&amp;#34;&lt;br/&gt;&lt;br/&gt;# --- 3. Mount overlayfs ---&lt;br/&gt;&lt;br/&gt;mount -t overlay overlay \&lt;br/&gt;  -o lowerdir=&amp;#34;$LOWERDIR&amp;#34;,upperdir=&amp;#34;$UPPERDIR&amp;#34;,workdir=&amp;#34;$WORKDIR&amp;#34; \&lt;br/&gt;  &amp;#34;$MOUNTPOINT&amp;#34;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;For additional anti-forensic protection, you can use this script and redirect all system journal logs to memory (volatile storage). Additionally, this script deletes files containing metadata about removed VMs (this is simple file deletion, which has anti-forensic value only in the context of TRIM/discard on NVMe SSD, but is not direct anti-forensics). The basis of this script (files removing) is the second script from this guide:&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;sudo tee /etc/systemd/journald.conf &amp;lt;&amp;lt; EOF&lt;br/&gt;[Journal]&lt;br/&gt;Storage=volatile&lt;br/&gt;EOF&lt;br/&gt;sudo systemctl restart systemd-journald&lt;br/&gt;&lt;br/&gt;sudo tee /etc/systemd/system/clean.service &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;[Unit]&lt;br/&gt;Description=Clean logs of removed Qubes VMs&lt;br/&gt;After=qubesd.service&lt;br/&gt;&lt;br/&gt;[Service]&lt;br/&gt;Type=oneshot&lt;br/&gt;ExecStart=/usr/local/bin/clean.sh&lt;br/&gt;RemainAfterExit=no&lt;br/&gt;&lt;br/&gt;[Install]&lt;br/&gt;WantedBy=multi-user.target&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo tee /usr/local/bin/clean.sh &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;set -euo pipefail&lt;br/&gt;&lt;br/&gt;readonly LOGDIR=&amp;#39;/var/log&amp;#39;&lt;br/&gt;readonly TEMPDIR_ROOT=&amp;#39;/home/user/tmp&amp;#39;&lt;br/&gt;readonly MENUDIR=&amp;#39;/home/user/.config/menus/applications-merged&amp;#39;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;existing_qubes=$(qvm-ls --fields=name --raw-data | sort)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;all_qube_names=&amp;#39;&amp;#39;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;all_qube_names&#43;=$(find &amp;#34;${LOGDIR}/libvirt/libxl/&amp;#34; \&lt;br/&gt;    -type f \&lt;br/&gt;    -regextype posix-egrep \&lt;br/&gt;    -regex &amp;#39;.*\.log((\.old)|(-[0-9]{8}))?(\.gz)?$&amp;#39; \&lt;br/&gt;    -exec basename &amp;#34;{}&amp;#34; \; \&lt;br/&gt;    | sed -r &amp;#39;s/\.log((\.old)|(-[0-9]{8}))?(\.gz)?$//g&amp;#39; \&lt;br/&gt;    | sed -r &amp;#39;s/^(guid|qrexec|qubesdb)\.//g&amp;#39; \&lt;br/&gt;    | sort | uniq)$&amp;#39;\n&amp;#39;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;all_qube_names&#43;=$(find &amp;#34;${LOGDIR}/qubes/&amp;#34; \&lt;br/&gt;    -type f \&lt;br/&gt;    -regextype posix-egrep \&lt;br/&gt;    -regex &amp;#39;.*\.log((\.old)|(-[0-9]{8}))?(\.gz)?$&amp;#39; \&lt;br/&gt;    -exec basename &amp;#34;{}&amp;#34; \; \&lt;br/&gt;    | sed -r &amp;#39;s/\.log((\.old)|(-[0-9]{8}))?(\.gz)?$//g&amp;#39; \&lt;br/&gt;    | sed -r &amp;#39;s/^(guid|qrexec|qubesdb)\.//g&amp;#39; \&lt;br/&gt;    | sort | uniq)$&amp;#39;\n&amp;#39;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;all_qube_names&#43;=$(find &amp;#34;${LOGDIR}/xen/console/&amp;#34; \&lt;br/&gt;    -type f \&lt;br/&gt;    -regextype posix-egrep \&lt;br/&gt;    -regex &amp;#39;.*\/guest-.*\.log((\.old)|(-[0-9]{8}))?(\.gz)?$&amp;#39; \&lt;br/&gt;    -exec basename &amp;#34;{}&amp;#34; \; \&lt;br/&gt;    | sed -r &amp;#39;s/\.log((\.old)|(-[0-9]{8}))?(\.gz)?$//g&amp;#39; \&lt;br/&gt;    | sed -r &amp;#39;s/^guest-//g&amp;#39; \&lt;br/&gt;    | sort | uniq)$&amp;#39;\n&amp;#39;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;set &#43;e&lt;br/&gt;ram_pools=$(qvm-pool list | grep -Eio &amp;#39;^ram_pool_[^ ]&#43;&amp;#39; | sort | uniq)&lt;br/&gt;set -e&lt;br/&gt;all_qube_names&#43;=$(echo &amp;#34;${ram_pools}&amp;#34; | sed -r &amp;#39;s/^ram_pool_//g&amp;#39;)$&amp;#39;\n&amp;#39;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if [ -d &amp;#34;${TEMPDIR_ROOT}&amp;#34; ]; then&lt;br/&gt;    all_qube_names&#43;=$(find &amp;#34;${TEMPDIR_ROOT}&amp;#34; \&lt;br/&gt;        -mindepth 1 -maxdepth 1 -type d \&lt;br/&gt;        -exec basename &amp;#34;{}&amp;#34; \; \&lt;br/&gt;        | sort | uniq)$&amp;#39;\n&amp;#39;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;all_qube_names&#43;=$(find &amp;#34;${MENUDIR}&amp;#34; \&lt;br/&gt;    -regextype posix-egrep \&lt;br/&gt;    -regex &amp;#39;.*\/user-qubes-.*\.menu$&amp;#39; \&lt;br/&gt;    -exec basename &amp;#34;{}&amp;#34; \; \&lt;br/&gt;    | sed -r &amp;#39;s/\.menu$//g&amp;#39; \&lt;br/&gt;    | sed -r &amp;#39;s/^user-qubes-(disp)?vm-directory(_|-)//g&amp;#39; \&lt;br/&gt;    | sort | uniq)$&amp;#39;\n&amp;#39;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;all_qube_names=$(echo &amp;#34;${all_qube_names}&amp;#34; \&lt;br/&gt;    | sed -r &amp;#39;s/^(Domain-0|libxl-driver)$//g&amp;#39; \&lt;br/&gt;    | sed -r &amp;#39;/^\s*$/d&amp;#39; \&lt;br/&gt;    | sort | uniq)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;set &#43;e&lt;br/&gt;qubes_to_remove=$(diff --new-line-format=&amp;#39;&amp;#39; --unchanged-line-format=&amp;#39;&amp;#39; \&lt;br/&gt;    &amp;lt;(echo &amp;#34;${all_qube_names}&amp;#34;) &amp;lt;(echo &amp;#34;${existing_qubes}&amp;#34;) \&lt;br/&gt;    | sed -r &amp;#39;/^\s*$/d&amp;#39;)&lt;br/&gt;set -e&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;for qube_name in ${qubes_to_remove}; do&lt;br/&gt;    decoded_qube_name=$(echo &amp;#34;${qube_name}&amp;#34; \&lt;br/&gt;        | sed -r &amp;#39;s/_d/-/g&amp;#39; \&lt;br/&gt;        | sed -r &amp;#39;s/_u/_/g&amp;#39;)&lt;br/&gt;&lt;br/&gt;    log_pattern=&amp;#34;${qube_name}\.log((\.old)|(-[0-9]{8}))?(\.gz)?&amp;#34;&lt;br/&gt;    menu_pattern=&amp;#34;user-qubes-(disp)?vm-directory(_|-)${qube_name}\.menu&amp;#34;&lt;br/&gt;&lt;br/&gt;    declare -A targets&lt;br/&gt;    targets=([&amp;#34;${LOGDIR}/libvirt/libxl&amp;#34;]=&amp;#34;${log_pattern}&amp;#34;&lt;br/&gt;             [&amp;#34;${LOGDIR}/qubes&amp;#34;]=&amp;#34;((guid|qrexec|qubesdb)\.)?${log_pattern}&amp;#34;&lt;br/&gt;             [&amp;#34;${LOGDIR}/xen/console&amp;#34;]=&amp;#34;guest-${log_pattern}&amp;#34;&lt;br/&gt;             [&amp;#34;${MENUDIR}&amp;#34;]=&amp;#34;${menu_pattern}&amp;#34;)&lt;br/&gt;&lt;br/&gt;    if [ -d &amp;#34;${TEMPDIR_ROOT}&amp;#34; ]; then&lt;br/&gt;        targets&#43;=(&amp;#34;${TEMPDIR_ROOT}&amp;#34;=&amp;#34;${qube_name}&amp;#34;)&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    for search_dir in &amp;#34;${!targets[@]}&amp;#34;; do&lt;br/&gt;        mapfile -d $&amp;#39;\0&amp;#39; found_files &amp;lt; &amp;lt;(find &amp;#34;${search_dir}&amp;#34; \&lt;br/&gt;            -regextype posix-egrep \&lt;br/&gt;            -regex &amp;#34;.*\/${targets[${search_dir}]}$&amp;#34; \&lt;br/&gt;            -print0)&lt;br/&gt;        for file in &amp;#34;${found_files[@]}&amp;#34;; do&lt;br/&gt;            [ -z &amp;#34;${file}&amp;#34; ] &amp;amp;&amp;amp; continue&lt;br/&gt;            rm -rf &amp;#34;${file}&amp;#34;&lt;br/&gt;        done&lt;br/&gt;    done&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;for pool_name in ${ram_pools}; do&lt;br/&gt;    qube_name=$(echo &amp;#34;${pool_name}&amp;#34; | sed -r &amp;#39;s/^ram_pool_//&amp;#39;)&lt;br/&gt;    if ! echo &amp;#34;${existing_qubes}&amp;#34; | grep -qx &amp;#34;${qube_name}&amp;#34;; then&lt;br/&gt;        pool_mountpoint=$(qvm-pool info &amp;#34;${pool_name}&amp;#34; \&lt;br/&gt;            | grep -E &amp;#39;^dir_path&amp;#39; \&lt;br/&gt;            | sed -r &amp;#39;s/^dir_path\s&#43;//g&amp;#39;)&lt;br/&gt;        qvm-pool remove &amp;#34;${pool_name}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        umount &amp;#34;${pool_mountpoint}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        rm -rf &amp;#34;${pool_mountpoint}&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;find &amp;#34;${LOGDIR}/qubes/&amp;#34; -maxdepth 1 -type f -name &amp;#39;*.log.old&amp;#39; -delete&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo chmod &#43;x /usr/local/bin/clean.sh&lt;br/&gt;sudo systemctl daemon-reload&lt;br/&gt;sudo systemctl enable clean.service
    </content>
    <updated>2026-07-19T13:04:49Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsxqawuf2pltr9zl3caz9agj0csjnktcfnvvjhxnq3k4fjhgcl6rwszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032q60ccy</id>
    
      <title type="html">Encrypted AppVMs and Templates. Encrypted pool. Secret vault in a ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsxqawuf2pltr9zl3caz9agj0csjnktcfnvvjhxnq3k4fjhgcl6rwszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032q60ccy" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfq3hk6w9jjv0mg7s3zd9dp0w2526u0wuvduj48k4d0yw8lwed9jsppemhxue69uhkummn9ekx7mp0jgvhtk&#39;&gt;nevent1q…vhtk&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Encrypted AppVMs and Templates. Encrypted pool. Secret vault in a LUKS-Pool.&lt;br/&gt;&lt;br/&gt;:gear: Install:&lt;br/&gt;&lt;br/&gt;    Make sure there is sufficient free space (more than 3 GB) in dom0. You can resize dom0 these commands:&lt;br/&gt;&lt;br/&gt;sudo lvresize --size 3G /dev/mapper/qubes_dom0-root&lt;br/&gt;sudo resize2fs /dev/mapper/qubes_dom0-root&lt;br/&gt;sudo lvresize -L &#43;3G qubes_dom0/root-pool&lt;br/&gt;&lt;br/&gt;    I recommend disabling disk swap for maximum security: Qubes OS uses zram for compressed RAM swap, but also maintains a fallback swap partition at /dev/dm-5 which is not encrypted. For a vault pool setup, this is a security risk - sensitive memory pages from your secret VMs could be written to disk in plaintext.&lt;br/&gt;&lt;br/&gt;sudo sed -i &amp;#39;/\/dev\/mapper\/swap/!{/^[[:space:]]*#/!{/\&amp;lt;swap\&amp;gt;/s/^/# /}}&amp;#39; /etc/fstab&lt;br/&gt;sudo sed -i &amp;#39;/\/dev\/mapper\/swap/b; /[[:space:]]\&#43;swap[[:space:]]\&#43;/s/^/# /&amp;#39; /etc/fstab&lt;br/&gt;sudo dracut --force&lt;br/&gt;&lt;br/&gt;    Run this simple script for create 3 GB encrypted pool vault&lt;br/&gt;    (edit POOL_SIZE=&amp;#34;3G&amp;#34; if you need a different pool size)&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;set -euo pipefail&lt;br/&gt;&lt;br/&gt;POOL_DIR=&amp;#34;/var/lib/qubes/pools&amp;#34;&lt;br/&gt;POOL_IMG=&amp;#34;$POOL_DIR/vault.img&amp;#34;&lt;br/&gt;POOL_SIZE=&amp;#34;3G&amp;#34;&lt;br/&gt;VG_NAME=&amp;#34;vault_vg&amp;#34;&lt;br/&gt;LV_NAME=&amp;#34;vault_thin&amp;#34;&lt;br/&gt;MAPPER_NAME=&amp;#34;vault_crypt&amp;#34;&lt;br/&gt;&lt;br/&gt;cleanup() {&lt;br/&gt;    local dev=&amp;#34;${LOOP_DEV:-}&amp;#34;&lt;br/&gt;    if [ -n &amp;#34;$dev&amp;#34; ] &amp;amp;&amp;amp; losetup -a | grep -q &amp;#34;$dev&amp;#34;; then&lt;br/&gt;        echo &amp;#34;[*] Cleanup: detaching $dev&amp;#34;&lt;br/&gt;        losetup -d &amp;#34;$dev&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    fi&lt;br/&gt;}&lt;br/&gt;trap cleanup EXIT&lt;br/&gt;&lt;br/&gt;echo &amp;#34;========================================&amp;#34;&lt;br/&gt;echo &amp;#34;  Creating an encrypted Qubes pool&amp;#34;&lt;br/&gt;echo &amp;#34;========================================&amp;#34;&lt;br/&gt;echo&lt;br/&gt;&lt;br/&gt;if [ &amp;#34;$EUID&amp;#34; -ne 0 ]; then&lt;br/&gt;    echo &amp;#34;[!] This script must be run as root (dom0)&amp;#34;&lt;br/&gt;    exit 1&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;if [ -f &amp;#34;$POOL_IMG&amp;#34; ]; then&lt;br/&gt;    echo &amp;#34;[!] File $POOL_IMG already exists.&amp;#34;&lt;br/&gt;    read -r -p &amp;#34;    Delete and recreate? Type YES to confirm: &amp;#34; confirm&lt;br/&gt;    if [ &amp;#34;$confirm&amp;#34; != &amp;#34;YES&amp;#34; ]; then&lt;br/&gt;        echo &amp;#34;[!] Aborted by user&amp;#34;&lt;br/&gt;        exit 1&lt;br/&gt;    fi&lt;br/&gt;    rm -f &amp;#34;$POOL_IMG&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Creating directory $POOL_DIR&amp;#34;&lt;br/&gt;mkdir -p &amp;#34;$POOL_DIR&amp;#34;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Creating a loop file of size $POOL_SIZE&amp;#34;&lt;br/&gt;truncate -s &amp;#34;$POOL_SIZE&amp;#34; &amp;#34;$POOL_IMG&amp;#34;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Attaching loop device&amp;#34;&lt;br/&gt;LOOP_DEV=$(losetup -f --show &amp;#34;$POOL_IMG&amp;#34;)&lt;br/&gt;echo &amp;#34;    Device: $LOOP_DEV&amp;#34;&lt;br/&gt;&lt;br/&gt;echo&lt;br/&gt;echo &amp;#34;[*] Encrypting device $LOOP_DEV&amp;#34;&lt;br/&gt;echo &amp;#34;    Enter the LUKS passphrase (twice)&amp;#34;&lt;br/&gt;cryptsetup luksFormat &amp;#34;$LOOP_DEV&amp;#34;&lt;br/&gt;&lt;br/&gt;echo&lt;br/&gt;echo &amp;#34;[*] Opening the LUKS container&amp;#34;&lt;br/&gt;cryptsetup open &amp;#34;$LOOP_DEV&amp;#34; &amp;#34;$MAPPER_NAME&amp;#34;&lt;br/&gt;&lt;br/&gt;echo&lt;br/&gt;echo &amp;#34;[*] Creating LVM: PV -&amp;gt; VG -&amp;gt; Thin Pool&amp;#34;&lt;br/&gt;pvcreate &amp;#34;/dev/mapper/$MAPPER_NAME&amp;#34;&lt;br/&gt;vgcreate &amp;#34;$VG_NAME&amp;#34; &amp;#34;/dev/mapper/$MAPPER_NAME&amp;#34;&lt;br/&gt;lvcreate -T -n &amp;#34;$LV_NAME&amp;#34; -l &#43;100%FREE &amp;#34;$VG_NAME&amp;#34;&lt;br/&gt;&lt;br/&gt;echo&lt;br/&gt;echo &amp;#34;[*] Detaching the loop device (LVM stays active)&amp;#34;&lt;br/&gt;losetup -d &amp;#34;$LOOP_DEV&amp;#34;&lt;br/&gt;unset LOOP_DEV&lt;br/&gt;&lt;br/&gt;qvm-pool --add vault lvm_thin \&lt;br/&gt;    -o volume_group=vault_vg,thin_pool=vault_thin,revisions_to_keep=2&lt;br/&gt;echo&lt;br/&gt;echo &amp;#34;========================================&amp;#34;&lt;br/&gt;echo &amp;#34;  Pool created successfully!&amp;#34;&lt;br/&gt;echo &amp;#34;========================================&amp;#34;&lt;br/&gt;&lt;br/&gt;cat &amp;gt; /usr/local/bin/vault-open &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;# open-and-register-vault.sh&lt;br/&gt;&lt;br/&gt;set -euo pipefail&lt;br/&gt;&lt;br/&gt;if [ &amp;#34;$EUID&amp;#34; -ne 0 ]; then&lt;br/&gt;    echo &amp;#34;[!] Must be run as root&amp;#34;&lt;br/&gt;    exit 1&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# 1. Attach loop&lt;br/&gt;LOOP_DEV=$(losetup -f --show /var/lib/qubes/pools/vault.img)&lt;br/&gt;echo &amp;#34;[*] Loop: $LOOP_DEV&amp;#34;&lt;br/&gt;&lt;br/&gt;# 2. Unlock LUKS&lt;br/&gt;cryptsetup open &amp;#34;$LOOP_DEV&amp;#34; vault_crypt&lt;br/&gt;echo &amp;#34;[*] LUKS opened&amp;#34;&lt;br/&gt;&lt;br/&gt;# 3. Activate LVM&lt;br/&gt;vgchange -ay vault_vg&lt;br/&gt;echo &amp;#34;[*] LVM activated&amp;#34;&lt;br/&gt;&lt;br/&gt;# 4. Register pool in Qubes if not already present&lt;br/&gt;if ! qvm-pool --list | grep -q &amp;#34;^vault &amp;#34;; then&lt;br/&gt;    echo &amp;#34;[*] Registering pool in Qubes&amp;#34;&lt;br/&gt;    qvm-pool --add vault lvm_thin \&lt;br/&gt;        -o volume_group=vault_vg,thin_pool=vault_thin,revisions_to_keep=2&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;[*] Pool already registered&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Done. Verification:&amp;#34;&lt;br/&gt;qvm-pool --info vault&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;cat &amp;gt; /usr/local/bin/vault-close &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;# close-vault.sh&lt;br/&gt;&lt;br/&gt;set -euo pipefail&lt;br/&gt;&lt;br/&gt;if [ &amp;#34;$EUID&amp;#34; -ne 0 ]; then&lt;br/&gt;    echo &amp;#34;[!] Must be run as root&amp;#34;&lt;br/&gt;    exit 1&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# 1. Stop all running VMs from the vault pool&lt;br/&gt;RUNNING_VMS=$(qvm-ls --running --fields=name,pool | grep vault | awk &amp;#39;{print $1}&amp;#39; || true)&lt;br/&gt;if [ -n &amp;#34;$RUNNING_VMS&amp;#34; ]; then&lt;br/&gt;    echo &amp;#34;[*] Stopping VMs from the vault pool...&amp;#34;&lt;br/&gt;    for vm in $RUNNING_VMS; do&lt;br/&gt;        echo &amp;#34;    -&amp;gt; $vm&amp;#34;&lt;br/&gt;        qvm-shutdown --wait &amp;#34;$vm&amp;#34;&lt;br/&gt;    done&lt;br/&gt;    echo &amp;#34;[*] All vault pool VMs stopped&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# 2. Deactivate LVM&lt;br/&gt;vgchange -an vault_vg || true&lt;br/&gt;&lt;br/&gt;# 3. Close LUKS (wipes key from kernel memory)&lt;br/&gt;cryptsetup close vault_crypt || true&lt;br/&gt;&lt;br/&gt;# 4. Detach loop&lt;br/&gt;LOOP_DEV=$(losetup -j /var/lib/qubes/pools/vault.img 2&amp;gt;/dev/null | head -1 | cut -d: -f1)&lt;br/&gt;if [ -n &amp;#34;$LOOP_DEV&amp;#34; ]; then&lt;br/&gt;    losetup -d &amp;#34;$LOOP_DEV&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Pool locked and key wiped from memory&amp;#34;&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;    Confirm creation: When prompted, type YES to proceed (this overwrites any existing vault pool file).&lt;br/&gt;&lt;br/&gt;    Set your LUKS passphrase: Enter and confirm a strong passphrase when prompted - this will be required every time you unlock the pool.&lt;br/&gt;&lt;br/&gt;    Open the pool when needed in dom0:&lt;br/&gt;    sudo vault-open&lt;br/&gt;    and enter your LUKS passphrase.&lt;br/&gt;&lt;br/&gt;    Assign VMs to the vault pool via Qubes Manager: click clone qube and in Advanced select vault in Storage pool. Or create a new qube, and select vault Storage pool in the Advanced Options.&lt;br/&gt;    1&lt;br/&gt;    1751×251 21.3 KB&lt;br/&gt;&lt;br/&gt;    Now your secret VMs can run.&lt;br/&gt;&lt;br/&gt;    Close the pool when finished:&lt;br/&gt;    sudo vault-close&lt;br/&gt;    this shuts down all vault VMs, deactivates LVM, wipes the encryption key from kernel memory, and locks the container.&lt;br/&gt;&lt;br/&gt;:eyes: :eyes:&lt;br/&gt;&lt;br/&gt;    Opening large pools takes time. If you created a large pool and it contains significant data (tens of GB), opening it with vault-open may take 10-20 seconds - this is normal, as LVM needs to scan and activate the thin pool metadata.&lt;br/&gt;&lt;br/&gt;    Backup the container along with your VMs. You can copy the encrypted container file together with backups of your AppVMs from this pool. The container is located at:&lt;br/&gt;    /var/lib/qubes/pools/vault.img&lt;br/&gt;    Since the container is fully encrypted, you can store it on external media or in cloud storage without additional encryption - the LUKS passphrase protects all data inside.&lt;br/&gt;&lt;br/&gt;    If you need additional disk swap, you can create an ephemeral encrypted swap - there’s a simple guide in the description of this guide.&lt;br/&gt;&lt;br/&gt;:bomb: Removing Encrypted Pool&lt;br/&gt;&lt;br/&gt;To completely remove the vault pool and all associated data, use this script. This will permanently delete all VMs stored in the pool.&lt;br/&gt;(When prompted, type DELETE to proceed - this permanently destroys all vault VMs and their data)&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;set -euo pipefail&lt;br/&gt;&lt;br/&gt;POOL_NAME=&amp;#34;vault&amp;#34;&lt;br/&gt;POOL_DIR=&amp;#34;/var/lib/qubes/pools&amp;#34;&lt;br/&gt;POOL_IMG=&amp;#34;$POOL_DIR/vault.img&amp;#34;&lt;br/&gt;VG_NAME=&amp;#34;vault_vg&amp;#34;&lt;br/&gt;LV_NAME=&amp;#34;vault_thin&amp;#34;&lt;br/&gt;MAPPER_NAME=&amp;#34;vault_crypt&amp;#34;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;========================================&amp;#34;&lt;br/&gt;echo &amp;#34;  Removing encrypted pool&amp;#34;&lt;br/&gt;echo &amp;#34;========================================&amp;#34;&lt;br/&gt;echo&lt;br/&gt;&lt;br/&gt;if [ &amp;#34;$EUID&amp;#34; -ne 0 ]; then&lt;br/&gt;    echo &amp;#34;[!] This script must be run as root (dom0)&amp;#34;&lt;br/&gt;    exit 1&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[!] WARNING: ALL data in the pool will be destroyed!&amp;#34;&lt;br/&gt;read -r -p &amp;#34;    Type DELETE to confirm: &amp;#34; confirm&lt;br/&gt;if [ &amp;#34;$confirm&amp;#34; != &amp;#34;DELETE&amp;#34; ]; then&lt;br/&gt;    echo &amp;#34;[!] Aborted by user&amp;#34;&lt;br/&gt;    exit 1&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;for vm in $(qvm-ls --raw-list 2&amp;gt;/dev/null); do&lt;br/&gt;    if qvm-volume list &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null | grep -q &amp;#34;${POOL_NAME}&amp;#34;; then&lt;br/&gt;        echo &amp;#34;    -&amp;gt; Removing VM: $vm&amp;#34;&lt;br/&gt;        qvm-kill &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        sleep 1&lt;br/&gt;        qvm-remove --force &amp;#34;$vm&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;        sleep 1&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;if lvs &amp;#34;$VG_NAME/$LV_NAME&amp;#34; &amp;amp;&amp;gt;/dev/null; then&lt;br/&gt;    echo &amp;#34;[*] Deactivating thin pool $VG_NAME/$LV_NAME&amp;#34;&lt;br/&gt;    lvchange -an &amp;#34;$VG_NAME/$LV_NAME&amp;#34; || true&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;if vgs &amp;#34;$VG_NAME&amp;#34; &amp;amp;&amp;gt;/dev/null; then&lt;br/&gt;    echo &amp;#34;[*] Deactivating Volume Group $VG_NAME&amp;#34;&lt;br/&gt;    vgchange -an &amp;#34;$VG_NAME&amp;#34; || true&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;if dmsetup info &amp;#34;$MAPPER_NAME&amp;#34; &amp;amp;&amp;gt;/dev/null; then&lt;br/&gt;    echo &amp;#34;[*] Closing LUKS container /dev/mapper/$MAPPER_NAME&amp;#34;&lt;br/&gt;    cryptsetup close &amp;#34;$MAPPER_NAME&amp;#34; || true&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;[*] LUKS container already closed&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;if vgs &amp;#34;$VG_NAME&amp;#34; &amp;amp;&amp;gt;/dev/null; then&lt;br/&gt;    echo &amp;#34;[*] Removing Volume Group $VG_NAME&amp;#34;&lt;br/&gt;    vgremove -y &amp;#34;$VG_NAME&amp;#34; || true&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;[*] Volume Group $VG_NAME not found or already removed&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;if [ -f &amp;#34;$POOL_IMG&amp;#34; ]; then&lt;br/&gt;    LOOP_DEV=$(losetup -j &amp;#34;$POOL_IMG&amp;#34; 2&amp;gt;/dev/null | head -1 | cut -d: -f1)&lt;br/&gt;    if [ -n &amp;#34;$LOOP_DEV&amp;#34; ]; then&lt;br/&gt;        echo &amp;#34;[*] Detaching loop device $LOOP_DEV&amp;#34;&lt;br/&gt;        losetup -d &amp;#34;$LOOP_DEV&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    else&lt;br/&gt;        echo &amp;#34;[*] Loop device already detached&amp;#34;&lt;br/&gt;    fi&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;if [ -f &amp;#34;$POOL_IMG&amp;#34; ]; then&lt;br/&gt;    echo &amp;#34;[*] Deleting container file $POOL_IMG&amp;#34;&lt;br/&gt;    rm -f &amp;#34;$POOL_IMG&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;if [ -d &amp;#34;$POOL_DIR&amp;#34; ] &amp;amp;&amp;amp; [ -z &amp;#34;$(ls -A &amp;#34;$POOL_DIR&amp;#34; 2&amp;gt;/dev/null)&amp;#34; ]; then&lt;br/&gt;    echo &amp;#34;[*] Removing empty directory $POOL_DIR&amp;#34;&lt;br/&gt;    rmdir &amp;#34;$POOL_DIR&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;qvm-pool remove $POOL_NAME&lt;br/&gt;&lt;br/&gt;echo&lt;br/&gt;echo &amp;#34;========================================&amp;#34;&lt;br/&gt;echo &amp;#34;  Pool removed&amp;#34;&lt;br/&gt;echo &amp;#34;========================================&amp;#34;
    </content>
    <updated>2026-07-19T13:02:32Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8u9huhnqnap2usdp4tgn9a48qhl4fncssnfvxk6ghek3m0hq0qaczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ynu368</id>
    
      <title type="html">This guide adds a hidden “nuke” password to your ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8u9huhnqnap2usdp4tgn9a48qhl4fncssnfvxk6ghek3m0hq0qaczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ynu368" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfq3hk6w9jjv0mg7s3zd9dp0w2526u0wuvduj48k4d0yw8lwed9jsppemhxue69uhkummn9ekx7mp0jgvhtk&#39;&gt;nevent1q…vhtk&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;This guide adds a hidden “nuke” password to your LUKS-encrypted disk. If you ever type this special password instead of your real one during boot, the system instantly and permanently destroys all encryption keys on the disk, making the data completely unrecoverable.&lt;br/&gt;&lt;br/&gt;Here’s how it works:&lt;br/&gt;During boot, your system asks for a password to unlock the disk.&lt;br/&gt;This guide installs a small wrapper that sits between the boot process and the standard disk-unlocking tool. Every time you enter a password, the wrapper quietly checks it against the nuke password hash stored on the system. If it’s your normal password, the wrapper simply passes it along to the regular unlocking tool and your disk opens as usual. But if it detects the nuke password, it immediately wipes all encryption key slots on the disk and overwrites the LUKS header with random data, effectively destroying the disk beyond recovery. The whole thing integrates seamlessly with the existing boot process, so the password prompt looks identical whether you’re entering your real password or the nuke one - there’s no visible indication that anything unusual happened until it’s too late.&lt;br/&gt;&lt;br/&gt;:warning: Warning! Do not test this script on your working system! You can install and configure the nuke module, but do not enter the nuke password for testing during Qubes OS boot! If you want to test the script, install a Fedora ISO and nuke it (I destroyed Fedora 43 and 44 with nuke password).&lt;br/&gt;&lt;br/&gt;Install:&lt;br/&gt;&lt;br/&gt;Install openssl:&lt;br/&gt;&lt;br/&gt;sudo qubes-dom0-update openssl&lt;br/&gt;&lt;br/&gt;Create dir for nuke password:&lt;br/&gt;&lt;br/&gt;sudo mkdir -p /etc/cryptsetup-nuke-ng&lt;br/&gt;sudo chmod 700 /etc/cryptsetup-nuke-ng&lt;br/&gt;&lt;br/&gt;Enter this command and then enter nuke password (hidden input):&lt;br/&gt;&lt;br/&gt;read -rs NUKE_PASS&lt;br/&gt;echo&lt;br/&gt;&lt;br/&gt;Generate random salt (enter this command and again enter nuke password (hidden input)):&lt;br/&gt;&lt;br/&gt;read -rs NUKE_PASS; echo; SALT=$(tr -dc &amp;#39;a-zA-Z0-9&amp;#39; &amp;lt;/dev/urandom | head -c 8); printf &amp;#39;%s&amp;#39; &amp;#34;$NUKE_PASS&amp;#34; | openssl passwd -6 -salt &amp;#34;$SALT&amp;#34; -stdin | sudo tee /etc/cryptsetup-nuke-ng/password_hash &amp;gt;/dev/null; sudo chmod 600 /etc/cryptsetup-nuke-ng/password_hash; NUKE_PASS=$(dd if=/dev/urandom bs=64 count=1 2&amp;gt;/dev/null | base64); unset NUKE_PASS&lt;br/&gt;&lt;br/&gt;Check hash format:&lt;br/&gt;sudo cat /etc/cryptsetup-nuke-ng/password_hash&lt;br/&gt;&lt;br/&gt;(should be: $6$salt$very_long_hash_string...)&lt;br/&gt;&lt;br/&gt;Password verification (enter this command and again enter nuke password (hidden input)):&lt;br/&gt;read -rs TEST_PASS; echo; HASH=$(sudo cat /etc/cryptsetup-nuke-ng/password_hash); SALT=$(echo &amp;#34;$HASH&amp;#34; | sed &amp;#39;s/^\$6\$\([^$]*\)\$.*/\1/&amp;#39;); printf &amp;#39;%s&amp;#39; &amp;#34;$TEST_PASS&amp;#34; | openssl passwd -6 -salt &amp;#34;$SALT&amp;#34; -stdin | grep -q &amp;#34;^$(sudo cat /etc/cryptsetup-nuke-ng/password_hash)$&amp;#34; &amp;amp;&amp;amp; echo &amp;#34;✓ MATCH&amp;#34; || echo &amp;#34;✗ NO MATCH&amp;#34;; unset TEST_PASS&lt;br/&gt;&lt;br/&gt;(should be: ✓ MATCH)&lt;br/&gt;&lt;br/&gt;Create dracut module:&lt;br/&gt;&lt;br/&gt;sudo mkdir -p /usr/lib/dracut/modules.d/99nuke-systemd&lt;br/&gt;sudo tee /usr/lib/dracut/modules.d/99nuke-systemd/module-setup.sh &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;check() {&lt;br/&gt;    if [ ! -f /etc/cryptsetup-nuke-ng/password_hash ]; then&lt;br/&gt;        derror &amp;#34;nuke password hash not found&amp;#34;&lt;br/&gt;        return 1&lt;br/&gt;    fi&lt;br/&gt;    return 0&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;depends() {&lt;br/&gt;    echo systemd crypt&lt;br/&gt;    return 0&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;install() {&lt;br/&gt;    inst /etc/cryptsetup-nuke-ng/password_hash&lt;br/&gt;    inst_multiple dd mktemp rm cat printf stty cryptsetup openssl systemd-ask-password&lt;br/&gt;    &lt;br/&gt;    # Find the real systemd-cryptsetup&lt;br/&gt;    local real_binary=&amp;#34;&amp;#34;&lt;br/&gt;    for path in &amp;#34;$initdir/usr/bin/systemd-cryptsetup&amp;#34; &amp;#34;$initdir/usr/lib/systemd/systemd-cryptsetup&amp;#34;; do&lt;br/&gt;        if [ -f &amp;#34;$path&amp;#34; ] &amp;amp;&amp;amp; [ ! -L &amp;#34;$path&amp;#34; ]; then&lt;br/&gt;            real_binary=&amp;#34;$path&amp;#34;&lt;br/&gt;            break&lt;br/&gt;        fi&lt;br/&gt;    done&lt;br/&gt;    &lt;br/&gt;    if [ -z &amp;#34;$real_binary&amp;#34; ]; then&lt;br/&gt;        real_binary=$(find &amp;#34;$initdir&amp;#34; -name &amp;#34;systemd-cryptsetup&amp;#34; -type f ! -type l 2&amp;gt;/dev/null | head -n1)&lt;br/&gt;    fi&lt;br/&gt;    &lt;br/&gt;    if [ -z &amp;#34;$real_binary&amp;#34; ]; then&lt;br/&gt;        dfatal &amp;#34;Cannot find real systemd-cryptsetup binary in initramfs&amp;#34;&lt;br/&gt;        return 1&lt;br/&gt;    fi&lt;br/&gt;    &lt;br/&gt;    dinfo &amp;#34;Found systemd-cryptsetup at: $real_binary&amp;#34;&lt;br/&gt;    &lt;br/&gt;    # Save the original&lt;br/&gt;    mv &amp;#34;$real_binary&amp;#34; &amp;#34;${real_binary}.real&amp;#34;&lt;br/&gt;    &lt;br/&gt;    # Create the wrapper&lt;br/&gt;    cat &amp;gt; &amp;#34;$real_binary&amp;#34; &amp;lt;&amp;lt; &amp;#39;WRAPPER&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;set -e&lt;br/&gt;&lt;br/&gt;NUKE_HASH_FILE=&amp;#34;/etc/cryptsetup-nuke-ng/password_hash&amp;#34;&lt;br/&gt;SYSTEMD_CRYPTSETUP=&amp;#34;${0}.real&amp;#34;&lt;br/&gt;&lt;br/&gt;# If no hash present — just run the original&lt;br/&gt;if [ ! -f &amp;#34;$NUKE_HASH_FILE&amp;#34; ]; then&lt;br/&gt;    exec &amp;#34;$SYSTEMD_CRYPTSETUP&amp;#34; &amp;#34;$@&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;NUKE_HASH=$(cat &amp;#34;$NUKE_HASH_FILE&amp;#34;)&lt;br/&gt;NUKE_SALT=$(echo &amp;#34;$NUKE_HASH&amp;#34; | sed &amp;#39;s/^\$6\$\([^$]*\)\$.*/\1/&amp;#39;)&lt;br/&gt;&lt;br/&gt;# Only for attach without keyfile&lt;br/&gt;if [ &amp;#34;$1&amp;#34; = &amp;#34;attach&amp;#34; ]; then&lt;br/&gt;    KEYFILE=&amp;#34;$4&amp;#34;&lt;br/&gt;    DEVICE=&amp;#34;$3&amp;#34;&lt;br/&gt;    NAME=&amp;#34;$2&amp;#34;&lt;br/&gt;    &lt;br/&gt;    # If keyfile is specified and not &amp;#34;-&amp;#34;/&amp;#34;none&amp;#34;, the password is not requested interactively&lt;br/&gt;    if [ -n &amp;#34;$KEYFILE&amp;#34; ] &amp;amp;&amp;amp; [ &amp;#34;$KEYFILE&amp;#34; != &amp;#34;-&amp;#34; ] &amp;amp;&amp;amp; [ &amp;#34;$KEYFILE&amp;#34; != &amp;#34;none&amp;#34; ]; then&lt;br/&gt;        exec &amp;#34;$SYSTEMD_CRYPTSETUP&amp;#34; &amp;#34;$@&amp;#34;&lt;br/&gt;    fi&lt;br/&gt;    &lt;br/&gt;    # Request password via systemd-ask-password (Plymouth compatible!)&lt;br/&gt;    PASSWORD=$(systemd-ask-password --no-tty &amp;#34;Please enter passphrase for disk $NAME:&amp;#34; 2&amp;gt;/dev/null || true)&lt;br/&gt;    &lt;br/&gt;    # If systemd-ask-password didn&amp;#39;t work, fallback to TTY&lt;br/&gt;    if [ -z &amp;#34;$PASSWORD&amp;#34; ] &amp;amp;&amp;amp; [ -t 0 ]; then&lt;br/&gt;        printf &amp;#39;Please unlock disk %s: &amp;#39; &amp;#34;$NAME&amp;#34; &amp;gt;&amp;amp;2&lt;br/&gt;        stty -echo 2&amp;gt;/dev/null || true&lt;br/&gt;        IFS= read -r PASSWORD&lt;br/&gt;        stty echo 2&amp;gt;/dev/null || true&lt;br/&gt;        printf &amp;#39;\n&amp;#39; &amp;gt;&amp;amp;2&lt;br/&gt;    fi&lt;br/&gt;    &lt;br/&gt;    # Verify nuke password via openssl&lt;br/&gt;    if [ -n &amp;#34;$PASSWORD&amp;#34; ]; then&lt;br/&gt;        COMPUTED=$(printf &amp;#39;%s&amp;#39; &amp;#34;$PASSWORD&amp;#34; | openssl passwd -6 -salt &amp;#34;$NUKE_SALT&amp;#34; -stdin)&lt;br/&gt;        &lt;br/&gt;        if [ &amp;#34;$COMPUTED&amp;#34; = &amp;#34;$NUKE_HASH&amp;#34; ]; then&lt;br/&gt;            printf &amp;#39;[NUKE] Nuke password detected! Destroying keys...\n&amp;#39; &amp;gt;&amp;amp;2&lt;br/&gt;            &lt;br/&gt;            # Destroy all keyslots&lt;br/&gt;            for slot in 0 1 2 3 4 5 6 7; do&lt;br/&gt;                cryptsetup luksKillSlot &amp;#34;$DEVICE&amp;#34; &amp;#34;$slot&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;            done&lt;br/&gt;            &lt;br/&gt;            # Overwrite the header for extra certainty&lt;br/&gt;            if command -v dd &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br/&gt;                dd if=/dev/urandom of=&amp;#34;$DEVICE&amp;#34; bs=1M count=4 2&amp;gt;/dev/null || true&lt;br/&gt;            fi&lt;br/&gt;            &lt;br/&gt;            printf &amp;#39;[NUKE] Device %s nuked.\n&amp;#39; &amp;#34;$DEVICE&amp;#34; &amp;gt;&amp;amp;2&lt;br/&gt;            exit 1&lt;br/&gt;        fi&lt;br/&gt;    fi&lt;br/&gt;    &lt;br/&gt;    # Pass the password via temporary file (keyfile)&lt;br/&gt;    KEYFILE=$(mktemp -p /dev/shm 2&amp;gt;/dev/null || mktemp)&lt;br/&gt;    chmod 600 &amp;#34;$KEYFILE&amp;#34;&lt;br/&gt;    printf &amp;#39;%s&amp;#39; &amp;#34;$PASSWORD&amp;#34; &amp;gt; &amp;#34;$KEYFILE&amp;#34;&lt;br/&gt;    PASSWORD=&amp;#34;&amp;#34;&lt;br/&gt;    &lt;br/&gt;    # Call the original with keyfile instead of interactive prompt&lt;br/&gt;    set &#43;e&lt;br/&gt;    &amp;#34;$SYSTEMD_CRYPTSETUP&amp;#34; &amp;#34;$1&amp;#34; &amp;#34;$2&amp;#34; &amp;#34;$3&amp;#34; &amp;#34;$KEYFILE&amp;#34; &amp;#34;$5&amp;#34;&lt;br/&gt;    STATUS=$?&lt;br/&gt;    set -e&lt;br/&gt;    &lt;br/&gt;    # Clean up keyfile&lt;br/&gt;    dd if=/dev/urandom of=&amp;#34;$KEYFILE&amp;#34; bs=512 count=1 2&amp;gt;/dev/null || true&lt;br/&gt;    rm -f &amp;#34;$KEYFILE&amp;#34;&lt;br/&gt;    &lt;br/&gt;    exit $STATUS&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# For all other commands — run the original&lt;br/&gt;exec &amp;#34;$SYSTEMD_CRYPTSETUP&amp;#34; &amp;#34;$@&amp;#34;&lt;br/&gt;WRAPPER&lt;br/&gt;&lt;br/&gt;    chmod &#43;x &amp;#34;$real_binary&amp;#34;&lt;br/&gt;    &lt;br/&gt;    # Update symlink if needed&lt;br/&gt;    if [ -L &amp;#34;$initdir/usr/lib/systemd/systemd-cryptsetup&amp;#34; ]; then&lt;br/&gt;        rm -f &amp;#34;$initdir/usr/lib/systemd/systemd-cryptsetup&amp;#34;&lt;br/&gt;        ln -s &amp;#34;../../bin/systemd-cryptsetup&amp;#34; &amp;#34;$initdir/usr/lib/systemd/systemd-cryptsetup&amp;#34;&lt;br/&gt;    fi&lt;br/&gt;    &lt;br/&gt;    dinfo &amp;#34;Installed nuke wrapper for systemd-cryptsetup&amp;#34;&lt;br/&gt;}&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo chmod &#43;x /usr/lib/dracut/modules.d/99nuke-systemd/module-setup.sh&lt;br/&gt;&lt;br/&gt;Dracut update:&lt;br/&gt;sudo dracut --force --verbose&lt;br/&gt;&lt;br/&gt;You will see this logs:&lt;br/&gt;&lt;br/&gt;...&lt;br/&gt;dracut[I]: *** Including module: nuke-systemd ***&lt;br/&gt;dracut[I]: Found systemd-cryptsetup at: /var/tmp/dracut.o6togY/initramfs/usr/bin/systemd-cryptsetup&lt;br/&gt;dracut[I]: Installed nuke wrapper for systemd-cryptsetup&lt;br/&gt;...&lt;br/&gt;&lt;br/&gt;:white_check_mark: Done!
    </content>
    <updated>2026-07-19T13:01:33Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswp9rd06y7wnef0cyxrkx5tuxhmqunmgz3xp9xulf2y59l0k2r0pqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630322pt7xu</id>
    
      <title type="html">Duress password is integrated at two authentication points: the ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswp9rd06y7wnef0cyxrkx5tuxhmqunmgz3xp9xulf2y59l0k2r0pqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630322pt7xu" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfq3hk6w9jjv0mg7s3zd9dp0w2526u0wuvduj48k4d0yw8lwed9jsppemhxue69uhkummn9ekx7mp0jgvhtk&#39;&gt;nevent1q…vhtk&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Duress password is integrated at two authentication points: the lightdm display manager for system login, and the xscreensaver lock screen for session unlock. This ensures the duress action can be triggered both at initial boot authentication and when unlocking an existing session.&lt;br/&gt;&lt;br/&gt;See this guide for creating a duress nuke-password for a LUKS-encrypted disk: Hidden “nuke” duress-password to LUKS-encrypted disk. Qubes OS LUKS self-destruct module&lt;br/&gt;&lt;br/&gt;Make backups of all your VMs beforehand.&lt;br/&gt;&lt;br/&gt;Download this repository in dvm:&lt;br/&gt;&lt;br/&gt;git clone &lt;a href=&#34;https://github.com/nuvious/pam-duress.git&#34;&gt;https://github.com/nuvious/pam-duress.git&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;then add it to a ZIP archive, for example pam.zip&lt;br/&gt;&lt;br/&gt;Send it to dom0 and extract archive&lt;br/&gt;qvm-run --pass-io dispXXX &amp;#39;cat /home/user/pam.zip&amp;#39; &amp;gt; pam.zip&lt;br/&gt;&lt;br/&gt;unzip pam.zip&lt;br/&gt;&lt;br/&gt;Run these commands to build the module in dom0 and create duress-password:&lt;br/&gt;sudo qubes-dom0-update gcc gcc-c&#43;&#43; make cmake automake pam-devel openssl-devel&lt;br/&gt;&lt;br/&gt;cd pam-duress&lt;br/&gt;make&lt;br/&gt;sudo make install PAM_DIR=/usr/lib64/security&lt;br/&gt;make clean&lt;br/&gt;&lt;br/&gt;mkdir -p ~/.duress   &lt;br/&gt;sudo mkdir -p /etc/duress.d&lt;br/&gt;&lt;br/&gt;Create a scripts with two scenarios:&lt;br/&gt;&lt;br/&gt;1. Scenario: Delete some VMs and delete this script itself:&lt;br/&gt;&lt;br/&gt;cat &amp;gt; ~/remove_vm.sh &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;if ! [ -w /run/qubesd.sock ] &amp;amp;&amp;amp; [ -z &amp;#34;$DURESS_REEXEC&amp;#34; ]; then&lt;br/&gt;    exec sg qubes &amp;#34;DURESS_REEXEC=1 $0 $*&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;export PATH=&amp;#34;/usr/bin:/usr/sbin:/bin:/sbin:$PATH&amp;#34;&lt;br/&gt;&lt;br/&gt;# Add the names of VMs to be deleted here &amp;#39;test_vm&amp;#39;&lt;br/&gt;/usr/bin/qvm-remove --force test_vm&lt;br/&gt;EOF&lt;br/&gt;chmod &#43;x ~/remove_vm.sh&lt;br/&gt;&lt;br/&gt;( :backhand_index_pointing_up: Add the names of VMs to be deleted here ‘test_vm’)&lt;br/&gt;&lt;br/&gt;2. Scenario: Total system destruction:&lt;br/&gt;&lt;br/&gt;cat &amp;gt; ~/remove_qubes.sh &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;# WARNING: This script irreversibly destroys data. Use only for duress password.&lt;br/&gt;&lt;br/&gt;if ! [ -w /run/qubesd.sock ] &amp;amp;&amp;amp; [ -z &amp;#34;$DURESS_REEXEC&amp;#34; ]; then&lt;br/&gt;    exec sg qubes &amp;#34;DURESS_REEXEC=1 $0 $*&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;export PATH=&amp;#34;/usr/bin:/usr/sbin:/bin:/sbin:$PATH&amp;#34;&lt;br/&gt;&lt;br/&gt;# ========== PHASE 0: REMOVE RAM-WIPE MODULE ==========&lt;br/&gt;RAM_WIPE_DIR=&amp;#34;/usr/lib/dracut/modules.d/40ram-wipe&amp;#34;&lt;br/&gt;if [ -d &amp;#34;$RAM_WIPE_DIR&amp;#34; ]; then&lt;br/&gt;    echo &amp;#34;[*] Removing ram-wipe dracut module to prevent shutdown stall...&amp;#34;&lt;br/&gt;    rm -rf &amp;#34;$RAM_WIPE_DIR&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# ========== PHASE 1: DESTROY LUKS HEADER ==========&lt;br/&gt;LUKS_DEV=&amp;#34;&amp;#34;&lt;br/&gt;for dev in /dev/nvme0n1p3 /dev/sda2 /dev/vda2 /dev/mapper/luks-*; do&lt;br/&gt;    cryptsetup isLuks &amp;#34;$dev&amp;#34; 2&amp;gt;/dev/null &amp;amp;&amp;amp; LUKS_DEV=&amp;#34;$dev&amp;#34; &amp;amp;&amp;amp; break&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;if [ -n &amp;#34;$LUKS_DEV&amp;#34; ]; then&lt;br/&gt;    echo &amp;#34;[*] Erasing LUKS header on $LUKS_DEV...&amp;#34;&lt;br/&gt;    if cryptsetup luksErase --batch-mode &amp;#34;$LUKS_DEV&amp;#34; 2&amp;gt;/dev/null; then&lt;br/&gt;        echo &amp;#34;[*] LUKS header destroyed. Triggering emergency reboot...&amp;#34;&lt;br/&gt;        echo 1 &amp;gt; /proc/sys/kernel/sysrq&lt;br/&gt;        echo b &amp;gt; /proc/sysrq-trigger&lt;br/&gt;        xl debug-keys R 2&amp;gt;/dev/null || true&lt;br/&gt;        exit 0&lt;br/&gt;    fi&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# ========== PHASE 2: FALLBACK - DESTROY ALL VMs &#43; CORRUPT LVM ==========&lt;br/&gt;echo &amp;#34;[!] LUKS erase failed or not found. Executing fallback destruction...&amp;#34;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Removing all qubes...&amp;#34;&lt;br/&gt;qvm-remove --all -f 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Corrupting LVM metadata...&amp;#34;&lt;br/&gt;vgremove -ff qubes_dom0 2&amp;gt;/dev/null || true&lt;br/&gt;for pv in /dev/nvme0n1p3 /dev/sda2 /dev/vda2; do&lt;br/&gt;    [ -b &amp;#34;$pv&amp;#34; ] &amp;amp;&amp;amp; dd if=/dev/urandom of=&amp;#34;$pv&amp;#34; bs=1M count=4 conv=notrunc 2&amp;gt;/dev/null &amp;amp;&amp;amp; break&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;# ========== PHASE 3: INSTANT REBOOT ==========&lt;br/&gt;echo &amp;#34;[*] Triggering emergency reboot...&amp;#34;&lt;br/&gt;echo 1 &amp;gt; /proc/sys/kernel/sysrq&lt;br/&gt;echo b &amp;gt; /proc/sysrq-trigger&lt;br/&gt;xl debug-keys R 2&amp;gt;/dev/null || true&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;chmod &#43;x ~/remove_qubes.sh&lt;br/&gt;&lt;br/&gt;Then add scripts in duress module:&lt;br/&gt;&lt;br/&gt;cat &amp;gt; ~/.duress/remove_passwd.sh &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/sh&lt;br/&gt;/home/user/remove_vm.sh&lt;br/&gt;rm -rf /home/user/remove_vm.sh&lt;br/&gt;rm -rf /var/log/qubes&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;cat &amp;gt; ~/.duress/remove_passwd2.sh &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/sh&lt;br/&gt;/home/user/remove_qubes.sh&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;then&lt;br/&gt;&lt;br/&gt;chmod 500 ~/.duress/remove_passwd.sh&lt;br/&gt;chmod 500 ~/.duress/remove_passwd2.sh&lt;br/&gt;&lt;br/&gt;duress_sign ~/.duress/remove_passwd.sh&lt;br/&gt;add alternative password for destroying VMs&lt;br/&gt;&lt;br/&gt;duress_sign ~/.duress/remove_passwd2.sh&lt;br/&gt;add alternative password for destroying system&lt;br/&gt;&lt;br/&gt;and then:&lt;br/&gt;&lt;br/&gt;chmod 400 ~/.duress/remove_passwd.sh.sha256&lt;br/&gt;chmod 400 ~/.duress/remove_passwd2.sh.sha256&lt;br/&gt;&lt;br/&gt;Check:&lt;br/&gt;ls -la ~/.duress/&lt;br/&gt;&lt;br/&gt;Module created.&lt;br/&gt;&lt;br/&gt;Now we need to modify this file /etc/pam.d/system-auth&lt;br/&gt;&lt;br/&gt;sudo nano /etc/system-auth&lt;br/&gt;&lt;br/&gt;Add this line&lt;br/&gt;auth        sufficient                                   pam_duress.so&lt;br/&gt;so that the first 6 auth-lines look like this:&lt;br/&gt;&lt;br/&gt;auth        required                                     pam_env.so&lt;br/&gt;auth        required                                     pam_faildelay.so delay=2000000&lt;br/&gt;auth        sufficient                                   pam_fprintd.so&lt;br/&gt;auth        sufficient                                   pam_unix.so nullok&lt;br/&gt;auth        sufficient                                   pam_duress.so&lt;br/&gt;auth        required                                     pam_deny.so&lt;br/&gt;&lt;br/&gt;then click Ctrl &#43; C and Ctrl &#43; X&lt;br/&gt;&lt;br/&gt;Done.&lt;br/&gt;&lt;br/&gt;:fire: Now first duress password will remove some VMs.&lt;br/&gt;:radioactive: Second duress password will destroy and forcibly shutdown the system. It should protect against forensics (disk will become unreadable).
    </content>
    <updated>2026-07-19T13:00:49Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs93pxw2fh4xsz8ff3h0ckjan84hkmhhtzuqpzgncfjl6t7vd4vquczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032xha9pd</id>
    
      <title type="html">Install Camoufox v150: Run in debian-13-xfce terminal: sudo apt ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs93pxw2fh4xsz8ff3h0ckjan84hkmhhtzuqpzgncfjl6t7vd4vquczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032xha9pd" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfq3hk6w9jjv0mg7s3zd9dp0w2526u0wuvduj48k4d0yw8lwed9jsppemhxue69uhkummn9ekx7mp0jgvhtk&#39;&gt;nevent1q…vhtk&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Install Camoufox v150:&lt;br/&gt;&lt;br/&gt;Run in debian-13-xfce terminal:&lt;br/&gt;sudo apt install python3.13-venv pip python3-pyqt5 python3-pyqt5.qtwebengine&lt;br/&gt;&lt;br/&gt;Shutdown debian-13-xfce template.&lt;br/&gt;&lt;br/&gt;Run in AppVM terminal:&lt;br/&gt;&lt;br/&gt;nano cam.py&lt;br/&gt;write the configuration code according to the Camoufox documentation, for example like this:&lt;br/&gt;&lt;br/&gt;from camoufox.utils import launch_options&lt;br/&gt;from playwright.sync_api import sync_playwright&lt;br/&gt;import os&lt;br/&gt;import time&lt;br/&gt;&lt;br/&gt;PROFILE_DIR = &amp;#34;/home/user/my_profile&amp;#34;&lt;br/&gt;&lt;br/&gt;if not os.path.exists(PROFILE_DIR):&lt;br/&gt;    raise FileNotFoundError(f&amp;#34;Профиль не найден: {PROFILE_DIR}&amp;#34;)&lt;br/&gt;&lt;br/&gt;options = launch_options(&lt;br/&gt;    headless=False,&lt;br/&gt;    os=&amp;#34;windows&amp;#34;,&lt;br/&gt;    locale=&amp;#34;en-US&amp;#34;,&lt;br/&gt;    window=(1696, 1026),&lt;br/&gt;    config={&lt;br/&gt;        &amp;#34;timezone&amp;#34;: &amp;#34;Europe/Istanbul&amp;#34;,&lt;br/&gt;        &amp;#34;geolocation:latitude&amp;#34;: 41.0082,&lt;br/&gt;        &amp;#34;geolocation:longitude&amp;#34;: 28.9784,&lt;br/&gt;        &amp;#34;navigator.language&amp;#34;: &amp;#34;en-US&amp;#34;,&lt;br/&gt;        &amp;#34;navigator.languages&amp;#34;: [&amp;#34;en-US&amp;#34;, &amp;#34;en&amp;#34;],&lt;br/&gt;        &amp;#34;headers.Accept-Language&amp;#34;: &amp;#34;en-US,en;q=0.9&amp;#34;,&lt;br/&gt;        &amp;#34;screen.width&amp;#34;: 1700,&lt;br/&gt;        &amp;#34;screen.height&amp;#34;: 970,&lt;br/&gt;        &amp;#34;screen.availWidth&amp;#34;: 1700,&lt;br/&gt;        &amp;#34;screen.availHeight&amp;#34;: 940,&lt;br/&gt;        &amp;#34;screen.colorDepth&amp;#34;: 24,&lt;br/&gt;        &amp;#34;screen.pixelDepth&amp;#34;: 24,&lt;br/&gt;    },&lt;br/&gt;    i_know_what_im_doing=True,&lt;br/&gt;)&lt;br/&gt;&lt;br/&gt;options.pop(&amp;#34;executable_path&amp;#34;, None)&lt;br/&gt;options.pop(&amp;#34;headless&amp;#34;, None)&lt;br/&gt;&lt;br/&gt;options[&amp;#34;viewport&amp;#34;] = {&amp;#34;width&amp;#34;: 1700, &amp;#34;height&amp;#34;: 970}&lt;br/&gt;&lt;br/&gt;custom_args = [&amp;#34;-new-instance&amp;#34;, &amp;#34;-no-remote&amp;#34;]&lt;br/&gt;if &amp;#34;args&amp;#34; in options:&lt;br/&gt;    custom_args = options.pop(&amp;#34;args&amp;#34;) &#43; custom_args&lt;br/&gt;&lt;br/&gt;with sync_playwright() as p:&lt;br/&gt;    context = p.firefox.launch_persistent_context(&lt;br/&gt;        user_data_dir=PROFILE_DIR,&lt;br/&gt;        executable_path=&amp;#34;/home/user/.cache/camoufox/browsers/official/150.0.2-alpha.26/camoufox-bin&amp;#34;,&lt;br/&gt;        headless=False,&lt;br/&gt;        args=custom_args,&lt;br/&gt;        **options&lt;br/&gt;    )&lt;br/&gt;    &lt;br/&gt;    page = context.pages[0] if context.pages else context.new_page()&lt;br/&gt;&lt;br/&gt;    try:&lt;br/&gt;        page.goto(&amp;#34;&lt;a href=&#34;https://abrahamjuliot.github.io/creepjs&amp;#34&#34;&gt;https://abrahamjuliot.github.io/creepjs&amp;#34&lt;/a&gt;;, wait_until=&amp;#34;commit&amp;#34;, timeout=60000)&lt;br/&gt;    except Exception as e:&lt;br/&gt;        print(f&amp;#34;Failed to load page: {e}&amp;#34;)&lt;br/&gt;    &lt;br/&gt;    while True:&lt;br/&gt;        try:&lt;br/&gt;            if context.pages is None:&lt;br/&gt;                break&lt;br/&gt;            pages = context.pages&lt;br/&gt;            if not pages:&lt;br/&gt;                break&lt;br/&gt;            page.evaluate(&amp;#34;1&amp;#34;)&lt;br/&gt;            time.sleep(1)&lt;br/&gt;        except Exception:&lt;br/&gt;            break&lt;br/&gt;    &lt;br/&gt;    try:&lt;br/&gt;        context.close()&lt;br/&gt;    except:&lt;br/&gt;        pass&lt;br/&gt;&lt;br/&gt;then click CTRL &#43; O and CTRL &#43; X&lt;br/&gt;&lt;br/&gt;python3 -m venv ~/venvs/camoufox150&lt;br/&gt;source ~/venvs/camoufox150/bin/activate&lt;br/&gt;pip install cloverlabs-camoufox[geoip]&lt;br/&gt;python3 -m camoufox fetch official/stable/v150.0.2-alpha.26&lt;br/&gt;pip install playwright==1.51.0&lt;br/&gt;python3 cam.py&lt;br/&gt;&lt;br/&gt;You can also use a profile created in Donut Browser. Profiles are located in /home/user/.local/share/DonutBrowser/profiles/. Copy profile to, for example, /home/user, rename it for simplicity, for example donut_profile, and add profile to Camoufox configuration into PROFILE_DIR = for example, PROFILE_DIR = &amp;#34;/home/user/donut_profile&amp;#34; or add this profile in camoufox gui manager.&lt;br/&gt;&lt;br/&gt;Create files .sh for launch this profiles:&lt;br/&gt;nano /home/user/camoufox.sh&lt;br/&gt;&lt;br/&gt;#!/usr/bin/env bash&lt;br/&gt;source ~/venvs/camoufox150/bin/activate&lt;br/&gt;python3 cam.py&lt;br/&gt;&lt;br/&gt;then click CTRL &#43; O and CTRL &#43; X&lt;br/&gt;chmod &#43;x /home/user/camoufox.sh&lt;br/&gt;&lt;br/&gt;You can add GUI profile manager for camoufox v150 GitHub - TechQaiser/camoufox-profile-manager: Manage multiple Camoufox browser profiles with proxy, storage, and fullscreen — GoLogin-style GUI built in PyQt5. · GitHub&lt;br/&gt;&lt;br/&gt;git clone &lt;a href=&#34;https://github.com/TechQaiser/camoufox-profile-manager.git&#34;&gt;https://github.com/TechQaiser/camoufox-profile-manager.git&lt;/a&gt;&lt;br/&gt;cd camoufox-profile-manager&lt;br/&gt;python3 -m venv venv&lt;br/&gt;&lt;br/&gt;then change py configs for camoufox v150 (default works on camoufox 135):&lt;br/&gt;nano /home/user/camoufox-profile-manager/run.py&lt;br/&gt;add this:&lt;br/&gt;&lt;br/&gt;import os&lt;br/&gt;import sys&lt;br/&gt;import subprocess&lt;br/&gt;import importlib.util&lt;br/&gt;from pathlib import Path&lt;br/&gt;&lt;br/&gt;REQUIREMENTS = [&amp;#34;PyQt5&amp;#34;, &amp;#34;cloverlabs-camoufox[geoip]&amp;#34;]&lt;br/&gt;&lt;br/&gt;HERE = Path(__file__).resolve().parent&lt;br/&gt;&lt;br/&gt;ENTRY_CANDIDATES = [&lt;br/&gt;    &amp;#34;main_window.py&amp;#34;,&lt;br/&gt;]&lt;br/&gt;&lt;br/&gt;def run(cmd, cwd=None):&lt;br/&gt;    print(f&amp;#34;[\~] Running: {&amp;#39; &amp;#39;.join(map(str, cmd))}&amp;#34;)&lt;br/&gt;    subprocess.check_call(cmd, cwd=str(cwd) if cwd else None)&lt;br/&gt;&lt;br/&gt;def pip_install(pkg):&lt;br/&gt;    run([sys.executable, &amp;#34;-m&amp;#34;, &amp;#34;pip&amp;#34;, &amp;#34;install&amp;#34;, pkg], cwd=HERE)&lt;br/&gt;&lt;br/&gt;def check_and_install():&lt;br/&gt;    try:&lt;br/&gt;        import pip&lt;br/&gt;    except ImportError:&lt;br/&gt;        print(&amp;#34;[x] pip is not installed. Please install pip and re-run.&amp;#34;)&lt;br/&gt;        sys.exit(1)&lt;br/&gt;&lt;br/&gt;    for spec in REQUIREMENTS:&lt;br/&gt;        base = spec.split(&amp;#34;[&amp;#34;, 1)[0]&lt;br/&gt;        if importlib.util.find_spec(base) is None:&lt;br/&gt;            print(f&amp;#34;[!] Missing {spec}, installing…&amp;#34;)&lt;br/&gt;            pip_install(spec)&lt;br/&gt;        else:&lt;br/&gt;            print(f&amp;#34;[✓] {base} already installed&amp;#34;)&lt;br/&gt;&lt;br/&gt;def ensure_camoufox_browser():&lt;br/&gt;    &amp;#34;&amp;#34;&amp;#34;Skip browser check&amp;#34;&amp;#34;&amp;#34;&lt;br/&gt;    print(&amp;#34;[✓] Skipping browser auto-install — using manually installed v150.0.2-alpha.26&amp;#34;)&lt;br/&gt;    return&lt;br/&gt;&lt;br/&gt;def find_entry_file() -&amp;gt; Path:&lt;br/&gt;    for name in ENTRY_CANDIDATES:&lt;br/&gt;        candidate = HERE / name&lt;br/&gt;        if candidate.exists():&lt;br/&gt;            return candidate&lt;br/&gt;    print(&amp;#34;[x] Could not find an entry file. Expected one of:&amp;#34;)&lt;br/&gt;    for n in ENTRY_CANDIDATES:&lt;br/&gt;        print(f&amp;#34;    - {n} (in {HERE})&amp;#34;)&lt;br/&gt;    sys.exit(2)&lt;br/&gt;&lt;br/&gt;def main():&lt;br/&gt;    check_and_install()&lt;br/&gt;    ensure_camoufox_browser()&lt;br/&gt;&lt;br/&gt;    entry = find_entry_file()&lt;br/&gt;    print(&amp;#34;\n[✓] Environment ready. Launching Camoufox Manager…\n&amp;#34;)&lt;br/&gt;    try:&lt;br/&gt;        run([sys.executable, str(entry.name)], cwd=HERE)&lt;br/&gt;    except subprocess.CalledProcessError as e:&lt;br/&gt;        print(&amp;#34;\n[x] Failed to launch the app.&amp;#34;)&lt;br/&gt;        print(f&amp;#34;    Command: {&amp;#39; &amp;#39;.join(map(str, e.cmd))}&amp;#34;)&lt;br/&gt;        print(f&amp;#34;    Exit code: {e.returncode}&amp;#34;)&lt;br/&gt;        sys.exit(e.returncode)&lt;br/&gt;&lt;br/&gt;if __name__ == &amp;#34;__main__&amp;#34;:&lt;br/&gt;    main()&lt;br/&gt;&lt;br/&gt;then click CTRL &#43; O and CTRL &#43; X&lt;br/&gt;&lt;br/&gt;nano /home/user/camoufox-profile-manager/main_window.py&lt;br/&gt;&lt;br/&gt;add this:&lt;br/&gt;&lt;br/&gt;import json&lt;br/&gt;import os&lt;br/&gt;import sys&lt;br/&gt;import time&lt;br/&gt;from dataclasses import dataclass, asdict, field&lt;br/&gt;from typing import Dict, Any, Optional, List&lt;br/&gt;from pathlib import Path&lt;br/&gt;&lt;br/&gt;from PyQt5 import QtCore, QtGui, QtWidgets, uic&lt;br/&gt;&lt;br/&gt;# ---- Camoufox ----------------------------------------------------------------&lt;br/&gt;try:&lt;br/&gt;    from camoufox.utils import launch_options&lt;br/&gt;    CAMOUFOX_OK = True&lt;br/&gt;except Exception:&lt;br/&gt;    CAMOUFOX_OK = False&lt;br/&gt;&lt;br/&gt;PROFILES_FILE = &amp;#34;profiles.json&amp;#34;&lt;br/&gt;&lt;br/&gt;CAMOUFOX_V150_EXE: Optional[str] = &amp;#34;/home/user/.cache/camoufox/browsers/official/150.0.2-alpha.26/camoufox-bin&amp;#34;&lt;br/&gt;&lt;br/&gt;if CAMOUFOX_V150_EXE is None and CAMOUFOX_OK:&lt;br/&gt;    from platformdirs import user_cache_dir&lt;br/&gt;    cache_dir = Path(user_cache_dir(&amp;#34;camoufox&amp;#34;))&lt;br/&gt;    version_dir = cache_dir / &amp;#34;browsers&amp;#34; / &amp;#34;official&amp;#34; / &amp;#34;150.0.2-alpha.26&amp;#34;&lt;br/&gt;    if sys.platform == &amp;#34;linux&amp;#34;:&lt;br/&gt;        candidate = version_dir / &amp;#34;camoufox-bin&amp;#34;&lt;br/&gt;        if candidate.exists():&lt;br/&gt;            CAMOUFOX_V150_EXE = str(candidate)&lt;br/&gt;    elif sys.platform == &amp;#34;darwin&amp;#34;:&lt;br/&gt;        candidate = version_dir / &amp;#34;Camoufox.app&amp;#34; / &amp;#34;Contents&amp;#34; / &amp;#34;Windows&amp;#34; / &amp;#34;camoufox&amp;#34;&lt;br/&gt;        if candidate.exists():&lt;br/&gt;            CAMOUFOX_V150_EXE = str(candidate)&lt;br/&gt;    elif sys.platform == &amp;#34;win32&amp;#34;:&lt;br/&gt;        candidate = version_dir / &amp;#34;camoufox.exe&amp;#34;&lt;br/&gt;        if candidate.exists():&lt;br/&gt;            CAMOUFOX_V150_EXE = str(candidate)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;# ===== Data models =====&lt;br/&gt;@dataclass&lt;br/&gt;class ProxyConfig:&lt;br/&gt;    host: str = &amp;#34;&amp;#34;&lt;br/&gt;    port: int = 0&lt;br/&gt;    username: str = &amp;#34;&amp;#34;&lt;br/&gt;    password: str = &amp;#34;&amp;#34;&lt;br/&gt;&lt;br/&gt;    def to_proxy_dict(self) -&amp;gt; Optional[Dict[str, Any]]:&lt;br/&gt;        if not self.host or not self.port:&lt;br/&gt;            return None&lt;br/&gt;        d = {&amp;#34;server&amp;#34;: f&amp;#34;&lt;a href=&#34;http://{self.host}:{self.port}&amp;#34&#34;&gt;http://{self.host}:{self.port}&amp;#34&lt;/a&gt;;}&lt;br/&gt;        if self.username:&lt;br/&gt;            d[&amp;#34;username&amp;#34;] = self.username&lt;br/&gt;        if self.password:&lt;br/&gt;            d[&amp;#34;password&amp;#34;] = self.password&lt;br/&gt;        return d&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;@dataclass&lt;br/&gt;class Profile:&lt;br/&gt;    name: str = &amp;#34;Profile&amp;#34;&lt;br/&gt;    viewport_width: int = 1700&lt;br/&gt;    viewport_height: int = 970&lt;br/&gt;    fullscreen: bool = False&lt;br/&gt;    persistent_dir: str = &amp;#34;&amp;#34;&lt;br/&gt;    use_geoip: bool = False&lt;br/&gt;    proxy: ProxyConfig = field(default_factory=ProxyConfig)&lt;br/&gt;&lt;br/&gt;    def to_dict(self) -&amp;gt; Dict[str, Any]:&lt;br/&gt;        d = asdict(self)&lt;br/&gt;        d[&amp;#34;proxy&amp;#34;] = asdict(self.proxy)&lt;br/&gt;        return d&lt;br/&gt;&lt;br/&gt;    @staticmethod&lt;br/&gt;    def from_dict(d: Dict[str, Any]) -&amp;gt; &amp;#34;Profile&amp;#34;:&lt;br/&gt;        raw_proxy = d.get(&amp;#34;proxy&amp;#34;, {})&lt;br/&gt;        if not isinstance(raw_proxy, dict):&lt;br/&gt;            raw_proxy = {}&lt;br/&gt;        name = d.get(&amp;#34;name&amp;#34;, &amp;#34;Profile&amp;#34;)&lt;br/&gt;&lt;br/&gt;        persistent_dir = d.get(&amp;#34;persistent_dir&amp;#34;, &amp;#34;&amp;#34;)&lt;br/&gt;        if not persistent_dir:&lt;br/&gt;            persistent_dir = os.path.join(&amp;#34;C:\\&amp;#34;, name)&lt;br/&gt;&lt;br/&gt;        return Profile(&lt;br/&gt;            name=name,&lt;br/&gt;            viewport_width=int(d.get(&amp;#34;viewport_width&amp;#34;, 1700)),&lt;br/&gt;            viewport_height=int(d.get(&amp;#34;viewport_height&amp;#34;, 970)),&lt;br/&gt;            fullscreen=bool(d.get(&amp;#34;fullscreen&amp;#34;, False)),&lt;br/&gt;            persistent_dir=persistent_dir,&lt;br/&gt;            use_geoip=bool(d.get(&amp;#34;use_geoip&amp;#34;, False)),&lt;br/&gt;            proxy=ProxyConfig(&lt;br/&gt;                host=raw_proxy.get(&amp;#34;host&amp;#34;, &amp;#34;&amp;#34;),&lt;br/&gt;                port=int(raw_proxy.get(&amp;#34;port&amp;#34;, 0) or 0),&lt;br/&gt;                username=raw_proxy.get(&amp;#34;username&amp;#34;, &amp;#34;&amp;#34;),&lt;br/&gt;                password=raw_proxy.get(&amp;#34;password&amp;#34;, &amp;#34;&amp;#34;),&lt;br/&gt;            ),&lt;br/&gt;        )&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;# ===== Persistence =====&lt;br/&gt;def load_profiles() -&amp;gt; List[Profile]:&lt;br/&gt;    if not os.path.exists(PROFILES_FILE):&lt;br/&gt;        return []&lt;br/&gt;    with open(PROFILES_FILE, &amp;#34;r&amp;#34;, encoding=&amp;#34;utf-8&amp;#34;) as f:&lt;br/&gt;        raw = json.load(f)&lt;br/&gt;    return [Profile.from_dict(x) for x in raw]&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;def save_profiles(profiles: List[Profile]) -&amp;gt; None:&lt;br/&gt;    with open(PROFILES_FILE, &amp;#34;w&amp;#34;, encoding=&amp;#34;utf-8&amp;#34;) as f:&lt;br/&gt;        json.dump([p.to_dict() for p in profiles], f, indent=2)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;# ===== Worker thread =====&lt;br/&gt;class CamoufoxWorker(QtCore.QThread):&lt;br/&gt;    started_ok = QtCore.pyqtSignal(str)&lt;br/&gt;    error = QtCore.pyqtSignal(str)&lt;br/&gt;    stopped = QtCore.pyqtSignal(str)&lt;br/&gt;&lt;br/&gt;    def __init__(self, profile: Profile, launch_size: Optional[tuple[int, int]] = None, parent=None):&lt;br/&gt;        super().__init__(parent)&lt;br/&gt;        self.profile = profile&lt;br/&gt;        self.launch_size = launch_size&lt;br/&gt;        self._stop = False&lt;br/&gt;        self._context = None&lt;br/&gt;        self._playwright = None&lt;br/&gt;&lt;br/&gt;    def run(self):&lt;br/&gt;        if not CAMOUFOX_OK:&lt;br/&gt;            self.error.emit(&lt;br/&gt;                &amp;#34;Camoufox Python package not available.\n&amp;#34;&lt;br/&gt;                &amp;#34;Install: pip install -U &amp;#39;cloverlabs-camoufox[geoip]&amp;#39;&amp;#34;&lt;br/&gt;            )&lt;br/&gt;            return&lt;br/&gt;&lt;br/&gt;        if not CAMOUFOX_V150_EXE or not os.path.exists(CAMOUFOX_V150_EXE):&lt;br/&gt;            self.error.emit(&lt;br/&gt;                f&amp;#34;Camoufox v150 executable not found.\n&amp;#34;&lt;br/&gt;                f&amp;#34;Expected at: {CAMOUFOX_V150_EXE or &amp;#39;&amp;lt;auto-detect failed&amp;gt;&amp;#39;}\n\n&amp;#34;&lt;br/&gt;                f&amp;#34;Please set CAMOUFOX_V150_EXE in the script to the correct path.\n&amp;#34;&lt;br/&gt;                f&amp;#34;Find it with: python3 -m camoufox list installed --path\n&amp;#34;&lt;br/&gt;                f&amp;#34;Or: ls ~/.cache/camoufox/browsers/official/&amp;#34;&lt;br/&gt;            )&lt;br/&gt;            return&lt;br/&gt;&lt;br/&gt;        try:&lt;br/&gt;            from playwright.sync_api import sync_playwright&lt;br/&gt;&lt;br/&gt;            VIEWPORT_W, VIEWPORT_H = 1700, 970&lt;br/&gt;&lt;br/&gt;            options = launch_options(&lt;br/&gt;                headless=False,&lt;br/&gt;                os=&amp;#34;windows&amp;#34;,&lt;br/&gt;                locale=&amp;#34;en-US&amp;#34;,&lt;br/&gt;                window=(1696, 1026),&lt;br/&gt;                config={&lt;br/&gt;                    &amp;#34;timezone&amp;#34;: &amp;#34;Europe/Berlin&amp;#34;,&lt;br/&gt;                    &amp;#34;navigator.language&amp;#34;: &amp;#34;en-US&amp;#34;,&lt;br/&gt;                    &amp;#34;navigator.languages&amp;#34;: [&amp;#34;en-US&amp;#34;, &amp;#34;en&amp;#34;],&lt;br/&gt;                    &amp;#34;headers.Accept-Language&amp;#34;: &amp;#34;en-US,en;q=0.9&amp;#34;,&lt;br/&gt;                    &amp;#34;screen.width&amp;#34;: 1700,&lt;br/&gt;	            &amp;#34;screen.height&amp;#34;: 970,&lt;br/&gt;	            &amp;#34;screen.availWidth&amp;#34;: 1700,&lt;br/&gt;	            &amp;#34;screen.availHeight&amp;#34;: 940,&lt;br/&gt;	            &amp;#34;screen.colorDepth&amp;#34;: 24,&lt;br/&gt;	            &amp;#34;screen.pixelDepth&amp;#34;: 24,&lt;br/&gt;                },&lt;br/&gt;                i_know_what_im_doing=True,&lt;br/&gt;            )&lt;br/&gt;&lt;br/&gt;            options.pop(&amp;#34;executable_path&amp;#34;, None)&lt;br/&gt;            options.pop(&amp;#34;headless&amp;#34;, None)&lt;br/&gt;&lt;br/&gt;            options[&amp;#34;viewport&amp;#34;] = {&amp;#34;width&amp;#34;: VIEWPORT_W, &amp;#34;height&amp;#34;: VIEWPORT_H}&lt;br/&gt;&lt;br/&gt;            custom_args = [&amp;#34;-new-instance&amp;#34;, &amp;#34;-no-remote&amp;#34;]&lt;br/&gt;            if &amp;#34;args&amp;#34; in options:&lt;br/&gt;                custom_args = options.pop(&amp;#34;args&amp;#34;) &#43; custom_args&lt;br/&gt;&lt;br/&gt;            user_data_dir = None&lt;br/&gt;            if self.profile.persistent_dir:&lt;br/&gt;                user_data_dir = os.path.abspath(self.profile.persistent_dir)&lt;br/&gt;                os.makedirs(user_data_dir, exist_ok=True)&lt;br/&gt;&lt;br/&gt;            px = self.profile.proxy.to_proxy_dict()&lt;br/&gt;            if px:&lt;br/&gt;                options[&amp;#34;proxy&amp;#34;] = px&lt;br/&gt;&lt;br/&gt;            with sync_playwright() as p:&lt;br/&gt;                self._playwright = p&lt;br/&gt;                self._context = p.firefox.launch_persistent_context(&lt;br/&gt;                    user_data_dir=user_data_dir,&lt;br/&gt;                    executable_path=CAMOUFOX_V150_EXE,&lt;br/&gt;                    headless=False,&lt;br/&gt;                    args=custom_args,&lt;br/&gt;                    **options&lt;br/&gt;                )&lt;br/&gt;&lt;br/&gt;                page = self._context.pages[0] if self._context.pages else self._context.new_page()&lt;br/&gt;&lt;br/&gt;                try:&lt;br/&gt;                    page.set_viewport_size({&amp;#34;width&amp;#34;: VIEWPORT_W, &amp;#34;height&amp;#34;: VIEWPORT_H})&lt;br/&gt;                except Exception:&lt;br/&gt;                    pass&lt;br/&gt;&lt;br/&gt;                try:&lt;br/&gt;                    page.goto(&amp;#34;&lt;a href=&#34;https://abrahamjuliot.github.io/creepjs&amp;#34&#34;&gt;https://abrahamjuliot.github.io/creepjs&amp;#34&lt;/a&gt;;, wait_until=&amp;#34;commit&amp;#34;, timeout=60000)&lt;br/&gt;                except Exception:&lt;br/&gt;                    pass&lt;br/&gt;&lt;br/&gt;                if self.profile.fullscreen:&lt;br/&gt;                    try:&lt;br/&gt;                        page.keyboard.press(&amp;#34;F11&amp;#34;)&lt;br/&gt;                    except Exception:&lt;br/&gt;                        pass&lt;br/&gt;&lt;br/&gt;                self.started_ok.emit(f&amp;#34;Session started for &amp;#39;{self.profile.name}&amp;#39;.&amp;#34;)&lt;br/&gt;&lt;br/&gt;                while not self._stop:&lt;br/&gt;                    time.sleep(0.2)&lt;br/&gt;&lt;br/&gt;                self._context.close()&lt;br/&gt;&lt;br/&gt;        except Exception as e:&lt;br/&gt;            self.error.emit(f&amp;#34;Failed to start Camoufox: {e}&amp;#34;)&lt;br/&gt;        finally:&lt;br/&gt;            if self._context is not None:&lt;br/&gt;                try:&lt;br/&gt;                    self._context.close()&lt;br/&gt;                except Exception:&lt;br/&gt;                    pass&lt;br/&gt;            self.stopped.emit(f&amp;#34;Session stopped for &amp;#39;{self.profile.name}&amp;#39;.&amp;#34;)&lt;br/&gt;&lt;br/&gt;    def request_stop(self):&lt;br/&gt;        self._stop = True&lt;br/&gt;&lt;br/&gt;# ===== MainWindow Controller =====&lt;br/&gt;class MainWindow(QtWidgets.QMainWindow):&lt;br/&gt;    def __init__(self):&lt;br/&gt;        super().__init__()&lt;br/&gt;        uic.loadUi(&amp;#34;camoufox_manager.ui&amp;#34;, self)&lt;br/&gt;&lt;br/&gt;        self.profileList: QtWidgets.QListWidget&lt;br/&gt;        self.newProfileButton: QtWidgets.QPushButton&lt;br/&gt;        self.deleteProfileButton: QtWidgets.QPushButton&lt;br/&gt;        self.nameEdit: QtWidgets.QLineEdit&lt;br/&gt;        self.spinW: QtWidgets.QSpinBox&lt;br/&gt;        self.spinH: QtWidgets.QSpinBox&lt;br/&gt;        self.fullscreenCheck: QtWidgets.QCheckBox&lt;br/&gt;        self.proxyHostEdit: QtWidgets.QLineEdit&lt;br/&gt;        self.proxyPortSpin: QtWidgets.QSpinBox&lt;br/&gt;        self.proxyUserEdit: QtWidgets.QLineEdit&lt;br/&gt;        self.proxyPassEdit: QtWidgets.QLineEdit&lt;br/&gt;        self.geoipCheck: QtWidgets.QCheckBox&lt;br/&gt;        self.storageEdit: QtWidgets.QLineEdit&lt;br/&gt;        self.browseStorageButton: QtWidgets.QPushButton&lt;br/&gt;        self.saveButton: QtWidgets.QPushButton&lt;br/&gt;        self.launchButton: QtWidgets.QPushButton&lt;br/&gt;        self.stopButton: QtWidgets.QPushButton&lt;br/&gt;&lt;br/&gt;        self.profiles: List[Profile] = load_profiles()&lt;br/&gt;        self.current_index: int = -1&lt;br/&gt;        self.worker: Optional[CamoufoxWorker] = None&lt;br/&gt;&lt;br/&gt;        self.profileList.itemSelectionChanged.connect(self._on_select_profile)&lt;br/&gt;        self.newProfileButton.clicked.connect(self._new_profile)&lt;br/&gt;        self.deleteProfileButton.clicked.connect(self._delete_profile)&lt;br/&gt;        self.saveButton.clicked.connect(self._save_changes)&lt;br/&gt;        self.browseStorageButton.clicked.connect(self._browse_storage)&lt;br/&gt;        self.launchButton.clicked.connect(self._launch)&lt;br/&gt;        self.stopButton.clicked.connect(self._stop)&lt;br/&gt;&lt;br/&gt;        self.launchButton.setObjectName(&amp;#34;primary&amp;#34;)&lt;br/&gt;        self.stopButton.setObjectName(&amp;#34;danger&amp;#34;)&lt;br/&gt;&lt;br/&gt;        self._refresh_list()&lt;br/&gt;        if self.profiles:&lt;br/&gt;            self.profileList.setCurrentRow(0)&lt;br/&gt;        self._set_running(False)&lt;br/&gt;&lt;br/&gt;        QtWidgets.QApplication.setStyle(&amp;#34;Fusion&amp;#34;)&lt;br/&gt;        self._apply_palette()&lt;br/&gt;        self.statusbar.showMessage(&amp;#34;Ready&amp;#34;)&lt;br/&gt;&lt;br/&gt;    def _apply_palette(self):&lt;br/&gt;        p = QtGui.QPalette()&lt;br/&gt;        base = QtGui.QColor(248, 249, 251)&lt;br/&gt;        text = QtGui.QColor(33, 37, 41)&lt;br/&gt;        highlight = QtGui.QColor(76, 110, 245)&lt;br/&gt;        p.setColor(QtGui.QPalette.Window, base)&lt;br/&gt;        p.setColor(QtGui.QPalette.Base, QtGui.QColor(255, 255, 255))&lt;br/&gt;        p.setColor(QtGui.QPalette.AlternateBase, QtGui.QColor(245, 246, 248))&lt;br/&gt;        p.setColor(QtGui.QPalette.WindowText, text)&lt;br/&gt;        p.setColor(QtGui.QPalette.Text, text)&lt;br/&gt;        p.setColor(QtGui.QPalette.ButtonText, text)&lt;br/&gt;        p.setColor(QtGui.QPalette.Highlight, highlight)&lt;br/&gt;        p.setColor(QtGui.QPalette.HighlightedText, QtGui.QColor(255, 255, 255))&lt;br/&gt;        self.setPalette(p)&lt;br/&gt;&lt;br/&gt;    def _refresh_list(self):&lt;br/&gt;        self.profileList.clear()&lt;br/&gt;        for p in self.profiles:&lt;br/&gt;            self.profileList.addItem(p.name)&lt;br/&gt;&lt;br/&gt;    def _current(self) -&amp;gt; Optional[Profile]:&lt;br/&gt;        if 0 &amp;lt;= self.current_index &amp;lt; len(self.profiles):&lt;br/&gt;            return self.profiles[self.current_index]&lt;br/&gt;        return None&lt;br/&gt;&lt;br/&gt;    def _populate_form(self, p: Optional[Profile]):&lt;br/&gt;        if not p:&lt;br/&gt;            self.nameEdit.setText(&amp;#34;&amp;#34;)&lt;br/&gt;            self.spinW.setValue(1700)&lt;br/&gt;            self.spinH.setValue(970)&lt;br/&gt;            self.fullscreenCheck.setChecked(False)&lt;br/&gt;            self.proxyHostEdit.setText(&amp;#34;&amp;#34;)&lt;br/&gt;            self.proxyPortSpin.setValue(0)&lt;br/&gt;            self.proxyUserEdit.setText(&amp;#34;&amp;#34;)&lt;br/&gt;            self.proxyPassEdit.setText(&amp;#34;&amp;#34;)&lt;br/&gt;            self.geoipCheck.setChecked(False)&lt;br/&gt;            self.storageEdit.setText(&amp;#34;&amp;#34;)&lt;br/&gt;            return&lt;br/&gt;        self.nameEdit.setText(p.name)&lt;br/&gt;        self.spinW.setValue(p.viewport_width)&lt;br/&gt;        self.spinH.setValue(p.viewport_height)&lt;br/&gt;        self.fullscreenCheck.setChecked(p.fullscreen)&lt;br/&gt;        self.proxyHostEdit.setText(p.proxy.host)&lt;br/&gt;        self.proxyPortSpin.setValue(p.proxy.port)&lt;br/&gt;        self.proxyUserEdit.setText(p.proxy.username)&lt;br/&gt;        self.proxyPassEdit.setText(p.proxy.password)&lt;br/&gt;        self.geoipCheck.setChecked(p.use_geoip)&lt;br/&gt;        self.storageEdit.setText(p.persistent_dir)&lt;br/&gt;&lt;br/&gt;    def _gather_form(self) -&amp;gt; Profile:&lt;br/&gt;        p = self._current() or Profile()&lt;br/&gt;        p.name = self.nameEdit.text().strip() or &amp;#34;Profile&amp;#34;&lt;br/&gt;        p.viewport_width = int(self.spinW.value())&lt;br/&gt;        p.viewport_height = int(self.spinH.value())&lt;br/&gt;        p.fullscreen = self.fullscreenCheck.isChecked()&lt;br/&gt;        p.proxy.host = self.proxyHostEdit.text().strip()&lt;br/&gt;        p.proxy.port = int(self.proxyPortSpin.value())&lt;br/&gt;        p.proxy.username = self.proxyUserEdit.text().strip()&lt;br/&gt;        p.proxy.password = self.proxyPassEdit.text().strip()&lt;br/&gt;        p.use_geoip = self.geoipCheck.isChecked()&lt;br/&gt;        s = self.storageEdit.text().strip()&lt;br/&gt;        if not s:&lt;br/&gt;            s = os.path.join(&amp;#34;C:\\&amp;#34;, p.name)&lt;br/&gt;        p.persistent_dir = s&lt;br/&gt;        return p&lt;br/&gt;&lt;br/&gt;    def _set_running(self, running: bool):&lt;br/&gt;        self.launchButton.setEnabled(not running)&lt;br/&gt;        self.stopButton.setEnabled(running)&lt;br/&gt;        for w in [&lt;br/&gt;            self.profileList, self.newProfileButton, self.deleteProfileButton,&lt;br/&gt;            self.nameEdit, self.spinW, self.spinH, self.fullscreenCheck,&lt;br/&gt;            self.proxyHostEdit, self.proxyPortSpin, self.proxyUserEdit, self.proxyPassEdit,&lt;br/&gt;            self.geoipCheck, self.storageEdit, self.browseStorageButton, self.saveButton&lt;br/&gt;        ]:&lt;br/&gt;            w.setEnabled(not running)&lt;br/&gt;&lt;br/&gt;    def _on_select_profile(self):&lt;br/&gt;        self.current_index = self.profileList.currentRow()&lt;br/&gt;        self._populate_form(self._current())&lt;br/&gt;&lt;br/&gt;    def _new_profile(self):&lt;br/&gt;        p = Profile(name=f&amp;#34;Profile {len(self.profiles)&#43;1}&amp;#34;)&lt;br/&gt;        p.persistent_dir = os.path.join(&amp;#34;C:\\&amp;#34;, p.name)&lt;br/&gt;        self.profiles.append(p)&lt;br/&gt;        save_profiles(self.profiles)&lt;br/&gt;        self._refresh_list()&lt;br/&gt;        self.profileList.setCurrentRow(len(self.profiles)-1)&lt;br/&gt;        self.statusbar.showMessage(&amp;#34;New profile created&amp;#34;, 3000)&lt;br/&gt;&lt;br/&gt;    def _delete_profile(self):&lt;br/&gt;        row = self.profileList.currentRow()&lt;br/&gt;        if row &amp;lt; 0:&lt;br/&gt;            return&lt;br/&gt;        name = self.profiles[row].name&lt;br/&gt;        if QtWidgets.QMessageBox.question(self, &amp;#34;Confirm Delete&amp;#34;, f&amp;#34;Delete profile &amp;#39;{name}&amp;#39;?&amp;#34;) != QtWidgets.QMessageBox.Yes:&lt;br/&gt;            return&lt;br/&gt;        del self.profiles[row]&lt;br/&gt;        save_profiles(self.profiles)&lt;br/&gt;        self._refresh_list()&lt;br/&gt;        self._populate_form(None)&lt;br/&gt;        self.current_index = -1&lt;br/&gt;        self.statusbar.showMessage(f&amp;#34;Deleted &amp;#39;{name}&amp;#39;&amp;#34;, 3000)&lt;br/&gt;&lt;br/&gt;    def _save_changes(self):&lt;br/&gt;        if self.current_index == -1:&lt;br/&gt;            self._new_profile()&lt;br/&gt;            return&lt;br/&gt;        self.profiles[self.current_index] = self._gather_form()&lt;br/&gt;        save_profiles(self.profiles)&lt;br/&gt;        self._refresh_list()&lt;br/&gt;        self.profileList.setCurrentRow(self.current_index)&lt;br/&gt;        self.statusbar.showMessage(&amp;#34;Profile saved&amp;#34;, 3000)&lt;br/&gt;&lt;br/&gt;    def _browse_storage(self):&lt;br/&gt;        d = QtWidgets.QFileDialog.getExistingDirectory(self, &amp;#34;Select Storage Directory&amp;#34;)&lt;br/&gt;        if d:&lt;br/&gt;            self.storageEdit.setText(d)&lt;br/&gt;&lt;br/&gt;    def _launch(self):&lt;br/&gt;        if self.worker and self.worker.isRunning():&lt;br/&gt;            self.statusbar.showMessage(&amp;#34;A session is already running&amp;#34;, 3000)&lt;br/&gt;            return&lt;br/&gt;        if self.current_index == -1:&lt;br/&gt;            QtWidgets.QMessageBox.information(self, &amp;#34;No profile&amp;#34;, &amp;#34;Create or select a profile first.&amp;#34;)&lt;br/&gt;            return&lt;br/&gt;&lt;br/&gt;        prof = self._gather_form()&lt;br/&gt;        self.profiles[self.current_index] = prof&lt;br/&gt;        save_profiles(self.profiles)&lt;br/&gt;&lt;br/&gt;        if not CAMOUFOX_OK:&lt;br/&gt;            QtWidgets.QMessageBox.warning(&lt;br/&gt;                self, &amp;#34;Camoufox not available&amp;#34;,&lt;br/&gt;                &amp;#34;Install with:\n  pip install -U &amp;#39;cloverlabs-camoufox[geoip]&amp;#39;&amp;#34;&lt;br/&gt;            )&lt;br/&gt;            return&lt;br/&gt;&lt;br/&gt;        if not CAMOUFOX_V150_EXE or not os.path.exists(CAMOUFOX_V150_EXE):&lt;br/&gt;            QtWidgets.QMessageBox.warning(&lt;br/&gt;                self, &amp;#34;Camoufox v150 not found&amp;#34;,&lt;br/&gt;                f&amp;#34;Executable not found at:\n{CAMOUFOX_V150_EXE or &amp;#39;&amp;lt;auto-detect failed&amp;gt;&amp;#39;}\n\n&amp;#34;&lt;br/&gt;                f&amp;#34;Set CAMOUFOX_V150_EXE in the script, or run:\n&amp;#34;&lt;br/&gt;                f&amp;#34;  python3 -m camoufox list installed --path\n&amp;#34;&lt;br/&gt;                f&amp;#34;to find the correct path.&amp;#34;&lt;br/&gt;            )&lt;br/&gt;            return&lt;br/&gt;&lt;br/&gt;        if prof.fullscreen:&lt;br/&gt;            screen = QtWidgets.QApplication.primaryScreen().availableGeometry()&lt;br/&gt;            launch_size = (screen.width(), screen.height())&lt;br/&gt;        else:&lt;br/&gt;            launch_size = (1700, 970)&lt;br/&gt;&lt;br/&gt;        self.worker = CamoufoxWorker(prof, launch_size)&lt;br/&gt;        self.worker.started_ok.connect(lambda m: self.statusbar.showMessage(m, 5000))&lt;br/&gt;        self.worker.error.connect(lambda m: QtWidgets.QMessageBox.critical(self, &amp;#34;Session Error&amp;#34;, m))&lt;br/&gt;        self.worker.stopped.connect(self._on_stopped)&lt;br/&gt;        self.worker.start()&lt;br/&gt;        self._set_running(True)&lt;br/&gt;&lt;br/&gt;    def _stop(self):&lt;br/&gt;        if self.worker and self.worker.isRunning():&lt;br/&gt;            self.worker.request_stop()&lt;br/&gt;            self.worker.wait(5000)&lt;br/&gt;            self.statusbar.showMessage(&amp;#34;Stopping session…&amp;#34;, 3000)&lt;br/&gt;        else:&lt;br/&gt;            self.statusbar.showMessage(&amp;#34;No session to stop&amp;#34;, 3000)&lt;br/&gt;&lt;br/&gt;    def _on_stopped(self, msg: str):&lt;br/&gt;        self.statusbar.showMessage(msg, 5000)&lt;br/&gt;        self._set_running(False)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;def apply_qss(app, path=&amp;#34;dark.qss&amp;#34;):&lt;br/&gt;    full = os.path.abspath(path)&lt;br/&gt;    if not os.path.exists(full):&lt;br/&gt;        raise FileNotFoundError(f&amp;#34;QSS not found: {full}&amp;#34;)&lt;br/&gt;    with open(full, &amp;#34;r&amp;#34;, encoding=&amp;#34;utf-8&amp;#34;) as f:&lt;br/&gt;        app.setStyleSheet(f.read())&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;def main():&lt;br/&gt;    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling, True)&lt;br/&gt;    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_UseHighDpiPixmaps, True)&lt;br/&gt;    app = QtWidgets.QApplication(sys.argv)&lt;br/&gt;    apply_qss(app, &amp;#34;dark.qss&amp;#34;)&lt;br/&gt;    win = MainWindow()&lt;br/&gt;    win.show()&lt;br/&gt;    sys.exit(app.exec_())&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;if __name__ == &amp;#34;__main__&amp;#34;:&lt;br/&gt;    main()&lt;br/&gt;&lt;br/&gt;then click CTRL &#43; O and CTRL &#43; X&lt;br/&gt;&lt;br/&gt;then run:&lt;br/&gt;&lt;br/&gt;source venv/bin/activate&lt;br/&gt;pip install PyQt5&lt;br/&gt;&lt;br/&gt;Create launch file for GUI manager:&lt;br/&gt;&lt;br/&gt;nano camoufox_gui.sh&lt;br/&gt;&lt;br/&gt;#!/usr/bin/env bash&lt;br/&gt;cd camoufox-profile-manager&lt;br/&gt;source venv/bin/activate&lt;br/&gt;python3 run.py&lt;br/&gt;&lt;br/&gt;then click CTRL &#43; O and CTRL &#43; X&lt;br/&gt;&lt;br/&gt;chmod &#43;x /home/user/camoufox_gui.sh&lt;br/&gt;&lt;br/&gt;Set this proxy value in user.js to enable internet access in the donor profile:&lt;br/&gt;user_pref(&amp;#34;network.proxy.type&amp;#34;, 0);
    </content>
    <updated>2026-07-19T13:00:05Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrhjtefv2p78yad3d9kje0wyjjw5k3qdy3yuwjz09tq3chl37kavgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032h455zv</id>
    
      <title type="html">Installation of AmneziaVPN app. Create a debian‑12-xfce or ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrhjtefv2p78yad3d9kje0wyjjw5k3qdy3yuwjz09tq3chl37kavgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032h455zv" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfq3hk6w9jjv0mg7s3zd9dp0w2526u0wuvduj48k4d0yw8lwed9jsppemhxue69uhkummn9ekx7mp0jgvhtk&#39;&gt;nevent1q…vhtk&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Installation of AmneziaVPN app.&lt;br/&gt;&lt;br/&gt;    Create a debian‑12-xfce or debian‑13-xfce template&lt;br/&gt;&lt;br/&gt;    Open Start → Settings → Qubes Tools → Qubes Template Manager.&lt;br/&gt;    Install the debian‑13‑xfce template&lt;br/&gt;    After installation, update the template via Qubes Update&lt;br/&gt;&lt;br/&gt;    If servers for Qubes are blocked in your country, use Whonix with Snowflake bridges: Tor Control Panel → Configure → Bridges type → snowflake&lt;br/&gt;&lt;br/&gt;    Install Required Packages in the Template&lt;br/&gt;&lt;br/&gt;    Launch a terminal inside the debian‑13‑xfce template.&lt;br/&gt;    Run:&lt;br/&gt;&lt;br/&gt;sudo apt install libxcb-cursor0 libxcb-xinerama0 libnss-resolve iptables&lt;br/&gt;&lt;br/&gt;    Download AmneziaVPN&lt;br/&gt;&lt;br/&gt;    Open a browser in the default‑dvm (a disposable VM).&lt;br/&gt;    Download the Linux version of AmneziaVPN:&lt;br/&gt;    Releases · amnezia-vpn/amnezia-client · GitHub&lt;br/&gt;    Mirror&lt;br/&gt;&lt;br/&gt;    Copy the Downloaded File to the Debian Template&lt;br/&gt;&lt;br/&gt;    Right‑click the downloaded file, choose Copy to other qube, then select the target VM debian‑13‑xfce.&lt;br/&gt;    In the debian‑13‑xfce VM, open Thunar.&lt;br/&gt;    Navigate to your home directory → QubesIncoming → the folder whose name starts with disp…. Inside you’ll find the AmneziaVPN archive.&lt;br/&gt;    Extract the archive and run the installer.&lt;br/&gt;&lt;br/&gt;    Refresh the Application Menu&lt;br/&gt;&lt;br/&gt;    Open Qube Manager (click the blue cube icon on the panel).&lt;br/&gt;    Select debian‑13‑xfce, then click App Shortcuts at the top.&lt;br/&gt;    Click Refresh Applications to update the menu list.&lt;br/&gt;    Shut down debian‑13‑xfce (right‑click → Shutdown).&lt;br/&gt;&lt;br/&gt;    Create a new VPN AppVM&lt;br/&gt;&lt;br/&gt;    In Qube Manager, create a new AppVM based on the debian-13-xfce template. Name it sys‑vpn or sys-amnezia.&lt;br/&gt;    Go to App Shortcuts for sys‑vpn and move AmneziaVPN and Thunar to the right side.&lt;br/&gt;&lt;br/&gt;    Install AmneziaVPN in the sys‑vpn VM&lt;br/&gt;&lt;br/&gt;    Copy the AmneziaVPN installer file (the one you downloaded earlier) into sys‑vpn.&lt;br/&gt;    Extract the archive again inside sys‑vpn and run the installer (Otherwise, AmneziaVPN might fail to start).&lt;br/&gt;&lt;br/&gt;    Launch and configure AmneziaVPN&lt;br/&gt;&lt;br/&gt;    AppMenu → sys‑vpn → AmneziaVPN&lt;br/&gt;&lt;br/&gt;    Click &#43; and activate the VPN using a key, a configuration file, a connection to your own VPS, or use the free and premium VPN by Amnezia.&lt;br/&gt;    1&lt;br/&gt;    1376×637 34.6 KB&lt;br/&gt;&lt;br/&gt;    Enable VLESS protocol in settings.&lt;br/&gt;&lt;br/&gt;    Set up autostart if desired.&lt;br/&gt;&lt;br/&gt;    Set Up a Kill Switch (Manual Configuration)&lt;br/&gt;&lt;br/&gt;    The built‑in kill switch in the AmneziaVPN app does not work under Qubes OS, so configure it manually in sys‑vpn&lt;br/&gt;&lt;br/&gt;    Open a terminal in sys‑vpn and start Thunar with root privileges:&lt;br/&gt;&lt;br/&gt;sudo thunar&lt;br/&gt;&lt;br/&gt;    Edit the file /rw/config/qubes-firewall-user-script and append the following rules at the bottom:&lt;br/&gt;&lt;br/&gt;nft add rule ip qubes custom-forward tcp flags syn / syn,rst tcp option maxseg size set rt mtu&lt;br/&gt;# Prevent the qube from forwarding traffic outside of the VPN&lt;br/&gt;nft add rule qubes custom-forward oifname eth0 counter drop&lt;br/&gt;nft add rule ip6 qubes custom-forward oifname eth0 counter drop&lt;br/&gt;&lt;br/&gt;(The first command fixes slow connection issues on Linux by adjusting the MTU).&lt;br/&gt;&lt;br/&gt;    Route Traffic Through the VPN&lt;br/&gt;&lt;br/&gt;    Assign sys‑vpn as the Net qube for sys‑whonix and for any other AppVMs where you want to hide the IP address.&lt;br/&gt;&lt;br/&gt;    Edit Global Update Settings&lt;br/&gt;&lt;br/&gt;    Open Global Settings → Updates.&lt;br/&gt;    Enable “Disable checking for updates for all existing qubes.”&lt;br/&gt;    In the “Except for following qubes, for which checking for updates will be enabled” field, add sys‑vpn and sys‑whonix.&lt;br/&gt;&lt;br/&gt;    Remember that new AppVMs will be added to the exceptions list for update checks. You’ll need to manually delete any unnecessary AppVMs (with the real IP).&lt;br/&gt;&lt;br/&gt;a&lt;br/&gt;a1572×1236 104 KB&lt;br/&gt;&lt;br/&gt;You can also use regular WireGuard config file and add it to the AmneziaVPN GUI application:&lt;br/&gt;&lt;br/&gt;    Click &#43; into AmneziaVPN app,&lt;br/&gt;    Then select “File with connection settings”,&lt;br/&gt;    Select wg.conf file and click “enable WireGuard obfuscation” option.&lt;br/&gt;&lt;br/&gt;awg&lt;br/&gt;awg1186×756 94.5 KB&lt;br/&gt;&lt;br/&gt;:white_check_mark: Done!&lt;br/&gt;&lt;br/&gt;Сelf‑host installation of AmneziaVPN.&lt;br/&gt;&lt;br/&gt;    Buy a server (VPS), if you don’t have one&lt;br/&gt;    Minimum system requirements for VPS:&lt;br/&gt;    Operating System - Linux, suitable for Ubuntu 22.04 or Debian 11.&lt;br/&gt;    Supported processor architecture - x86-64.&lt;br/&gt;    Virtualization - KVM.&lt;br/&gt;    IPv4 address support&lt;br/&gt;    Random Access Memory (RAM) - recommended 2 GB, but not less than 1 GB.&lt;br/&gt;    Pre-installed software and control panel are not required.&lt;br/&gt;&lt;br/&gt;To make it more convenient for you, we have selected several hosting providers. Choose a suitable server from the options provided below and follow the step-by-step instructions. You can also choose any other VPS provider at your discretion. All servers are provided as examples.&lt;br/&gt;&lt;br/&gt;:warning: Servers on Reg.ru and Yandex Cloud are not suitable for installing VPN with Amnezia&lt;br/&gt;&lt;br/&gt;:exclamation: These hosting providers are provided as an example, we do not take responsibility for the quality of services provided by these companies and for potential risks.&lt;br/&gt;The best VPS for Amnezia: &lt;a href=&#34;https://amnezia.host/en&#34;&gt;https://amnezia.host/en&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;    You will receive an email from the hosting provider&lt;br/&gt;&lt;br/&gt;The email should include the IP address, User name or User ID, and Password. You will need these for setting up the VPN on the server in the next step.&lt;br/&gt;&lt;br/&gt;|100%xauto&lt;br/&gt;|100%xauto2000×738 38.6 KB&lt;br/&gt;&lt;br/&gt;    :warning: Some hosting providers do not send server details via email. In such cases, you can usually find the server information in your hosting provider’s account dashboard. If you encounter difficulties, contact their support.&lt;br/&gt;&lt;br/&gt;    Download the AmneziaVPN app and enter the server details&lt;br/&gt;&lt;br/&gt;After installation, launch the application.&lt;br/&gt;&lt;br/&gt;On the first screen, select “I have connection details”, then “Set up your own server”, and enter the data from the email sent by the hosting provider.&lt;br/&gt;&lt;br/&gt;Press “Continue” for automatic installation and wait a moment.&lt;br/&gt;&lt;br/&gt;You can also choose the manual installation method - it’s just as easy! Click “Manual” and continue.&lt;br/&gt;&lt;br/&gt;Select the protocol. The best options are AmneziaWG for very fast speeds or X‑Ray to counter aggressive internet blocking.&lt;br/&gt;&lt;br/&gt;Then specify the port - you can keep the default port 443.&lt;br/&gt;&lt;br/&gt;Finally, click Install and wait a few minutes.&lt;br/&gt;&lt;br/&gt;That’s all!&lt;br/&gt;&lt;br/&gt;If you want to add other protocols, click your server, then the gear :gear: icon, and select additional protocol.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;:white_check_mark: Done!&lt;br/&gt;&lt;br/&gt;Installation of AWG – WG fork with the best obfuscation.&lt;br/&gt;&lt;br/&gt;    Install the kernel module in template&lt;br/&gt;    GitHub - amnezia-vpn/amneziawg-linux-kernel-module: AmneziaWG Linux kernel module · GitHub&lt;br/&gt;&lt;br/&gt;Open terminal in template fedora-43-xfce or debian-13-xfce.&lt;br/&gt;Use this guide for Manual build &lt;a href=&#34;https://github.com/amnezia-vpn/amneziawg-linux-kernel-module&#34;&gt;https://github.com/amnezia-vpn/amneziawg-linux-kernel-module&lt;/a&gt;:&lt;br/&gt;&lt;br/&gt;http_proxy=&lt;a href=&#34;http://127.0.0.1:8082&#34;&gt;http://127.0.0.1:8082&lt;/a&gt; https_proxy=&lt;a href=&#34;http://127.0.0.1:8082&#34;&gt;http://127.0.0.1:8082&lt;/a&gt; git clone &lt;a href=&#34;https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git&#34;&gt;https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git&lt;/a&gt;&lt;br/&gt;cd amneziawg-linux-kernel-module/src&lt;br/&gt;&lt;br/&gt;Skip step 2 from github guide (you’re using the kernel from dom0).&lt;br/&gt;&lt;br/&gt;make&lt;br/&gt;sudo make install&lt;br/&gt;&lt;br/&gt;    Activate the module and check it.&lt;br/&gt;&lt;br/&gt;sudo modprobe amneziawg&lt;br/&gt;lsmod | grep amneziawg&lt;br/&gt;&lt;br/&gt;    Add module to autostart.&lt;br/&gt;&lt;br/&gt;echo &amp;#34;amneziawg&amp;#34; | sudo tee /etc/modules-load.d/amneziawg.conf&lt;br/&gt;&lt;br/&gt;    Install amnezia-tools.&lt;br/&gt;    GitHub - amnezia-vpn/amneziawg-tools: Tools for configuring Amnezia-WG · GitHub&lt;br/&gt;&lt;br/&gt;http_proxy=&lt;a href=&#34;http://127.0.0.1:8082&#34;&gt;http://127.0.0.1:8082&lt;/a&gt; https_proxy=&lt;a href=&#34;http://127.0.0.1:8082&#34;&gt;http://127.0.0.1:8082&lt;/a&gt; git clone &lt;a href=&#34;https://github.com/amnezia-vpn/amneziawg-tools.git&#34;&gt;https://github.com/amnezia-vpn/amneziawg-tools.git&lt;/a&gt;&lt;br/&gt;cd amneziawg-tools/src&lt;br/&gt;&lt;br/&gt;make&lt;br/&gt;&lt;br/&gt;sudo make install&lt;br/&gt;&lt;br/&gt;    Now connect WireGuard configurations with awg and awg-quick tools for hide the VPN connection!&lt;br/&gt;&lt;br/&gt;Create a configuration file for your WG server or in your VPN app, or generate a awg-WARP config using generators:&lt;br/&gt;1 Перенаправление на проект&lt;br/&gt;2 &lt;a href=&#34;https://warp-generator.vercel.app/&#34;&gt;https://warp-generator.vercel.app/&lt;/a&gt;&lt;br/&gt;3 WARP WireGuard Config Generator&lt;br/&gt;4 &lt;a href=&#34;https://warp-gen.vercel.app/&#34;&gt;https://warp-gen.vercel.app/&lt;/a&gt;&lt;br/&gt;5 GitHub - ImMALWARE/bash-warp-generator: Генератор конфига Cloudflare WARP для AmneziaVPN · GitHub&lt;br/&gt;&lt;br/&gt;Remane it to awg0.conf. Edit file if you use your wireguard (add awg options), The configuration for AWG looks like this:&lt;br/&gt;&lt;br/&gt;[Interface]&lt;br/&gt;PrivateKey = ...&lt;br/&gt;S1 = 0&lt;br/&gt;S2 = 0&lt;br/&gt;Jc = 4&lt;br/&gt;Jmin = 40&lt;br/&gt;Jmax = 70&lt;br/&gt;H1 = 1&lt;br/&gt;H2 = 2&lt;br/&gt;H3 = 3&lt;br/&gt;H4 = 4&lt;br/&gt;MTU = 1280&lt;br/&gt;Address = ...&lt;br/&gt;DNS = ...&lt;br/&gt;&lt;br/&gt;[Peer]&lt;br/&gt;PublicKey = ...&lt;br/&gt;AllowedIPs = ...&lt;br/&gt;Endpoint = ...&lt;br/&gt;&lt;br/&gt;Move awg0.conf into the template and paste it into /etc/amnezia/amneziawg/ and then shutdown the template.&lt;br/&gt;&lt;br/&gt;    Create a sys-awg qube&lt;br/&gt;&lt;br/&gt;Create a new AppVM based on the template with AWG, name it something like sys‑awg and enable the “Provides network” option. Then, in sys‑awg terminal enter:&lt;br/&gt;sudo nano /rw/config/rc.local&lt;br/&gt;and paste those commands:&lt;br/&gt;sudo awg-quick up awg0&lt;br/&gt;sudo systemctl enable --now awg-quick@awg0.service&lt;br/&gt;&lt;br/&gt;Then set sys‑awg as the NetVM for the required appVMs. If the traffic isn’t being routed to appVMs, you need to add your awg’s DNS entry to /rw/config/rc.local in appVMs, for example:&lt;br/&gt;&lt;br/&gt;sudo nano /rw/config/rc.local&lt;br/&gt;and paste those commands:&lt;br/&gt;&lt;br/&gt;echo &amp;#39;nameserver 1.1.1.1&amp;#39; &amp;gt; /etc/resolv.conf&lt;br/&gt;echo &amp;#39;nameserver 1.0.0.1&amp;#39; &amp;gt; /etc/resolv.conf&lt;br/&gt;&lt;br/&gt;Enter this command in sys-awg to test the connection to awg:&lt;br/&gt;&lt;br/&gt;sudo awg show all&lt;br/&gt;&lt;br/&gt;:white_check_mark: Done!
    </content>
    <updated>2026-07-19T12:59:00Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs90my4rl0kvyv0fmcg3kpt8vl8hg6wfyajjs80z2vjc5vtr0c4h8qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032008qhm</id>
    
      <title type="html">DNScrypt-proxy qube. sys-dns with Encrypted DNS 1. Install ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs90my4rl0kvyv0fmcg3kpt8vl8hg6wfyajjs80z2vjc5vtr0c4h8qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032008qhm" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfq3hk6w9jjv0mg7s3zd9dp0w2526u0wuvduj48k4d0yw8lwed9jsppemhxue69uhkummn9ekx7mp0jgvhtk&#39;&gt;nevent1q…vhtk&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;DNScrypt-proxy qube. sys-dns with Encrypted DNS&lt;br/&gt;&lt;br/&gt;1. Install dnscrypt-proxy in the fedora-xfce template:&lt;br/&gt;&lt;br/&gt;sudo dnf install -y dnscrypt-proxy&lt;br/&gt;sudo systemctl enable dnscrypt-proxy&lt;br/&gt;&lt;br/&gt;2. Add dnscrypt-proxy configuration in fedora-xfce template:&lt;br/&gt;&lt;br/&gt;This setup enables DNSCrypt with anonymized DNS (via relays), enforces DNSSEC, no-logging, and no-filter policies, and disables DoH and Oblivious DoH:&lt;br/&gt;&lt;br/&gt;sudo tee /etc/dnscrypt-proxy/dnscrypt-proxy.toml &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;server_names = []&lt;br/&gt;listen_addresses = [&amp;#39;127.0.0.1:53&amp;#39;, &amp;#39;0.0.0.0:53&amp;#39;, &amp;#39;[::1]:53&amp;#39;]&lt;br/&gt;max_clients = 250&lt;br/&gt;ipv4_servers = true&lt;br/&gt;ipv6_servers = false&lt;br/&gt;dnscrypt_servers = true&lt;br/&gt;doh_servers = false&lt;br/&gt;odoh_servers = false&lt;br/&gt;require_dnssec = true&lt;br/&gt;require_nolog = true&lt;br/&gt;require_nofilter = true&lt;br/&gt;disabled_server_names = [&amp;#39;scaleway&amp;#39;, &amp;#39;scaleway-ams&amp;#39;]&lt;br/&gt;force_tcp = false&lt;br/&gt;timeout = 5000&lt;br/&gt;keepalive = 30&lt;br/&gt;cert_refresh_delay = 240&lt;br/&gt;bootstrap_resolvers = [&amp;#39;9.9.9.11:53&amp;#39;, &amp;#39;8.8.8.8:53&amp;#39;]&lt;br/&gt;ignore_system_dns = true&lt;br/&gt;log_files_max_size = 10&lt;br/&gt;log_files_max_age = 7&lt;br/&gt;log_files_max_backups = 1&lt;br/&gt;block_ipv6 = false&lt;br/&gt;block_unqualified = true&lt;br/&gt;block_undelegated = true&lt;br/&gt;reject_ttl = 10&lt;br/&gt;cache = true&lt;br/&gt;cache_size = 4096&lt;br/&gt;cache_min_ttl = 2400&lt;br/&gt;cache_max_ttl = 86400&lt;br/&gt;cache_neg_min_ttl = 60&lt;br/&gt;cache_neg_max_ttl = 600&lt;br/&gt;lb_strategy = &amp;#39;wp2&amp;#39;&lt;br/&gt;lb_estimator = true&lt;br/&gt;&lt;br/&gt;[sources.public-resolvers]&lt;br/&gt;urls = [&lt;br/&gt;    &amp;#39;&lt;a href=&#34;https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/public-resolvers.md&amp;#39&#34;&gt;https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/public-resolvers.md&amp;#39&lt;/a&gt;;,&lt;br/&gt;    &amp;#39;&lt;a href=&#34;https://download.dnscrypt.info/resolvers-list/v3/public-resolvers.md&amp;#39&#34;&gt;https://download.dnscrypt.info/resolvers-list/v3/public-resolvers.md&amp;#39&lt;/a&gt;;,&lt;br/&gt;    &amp;#39;&lt;a href=&#34;https://cdn.jsdelivr.net/gh/DNSCrypt/dnscrypt-resolvers@master/v3/public-resolvers.md&amp;#39&#34;&gt;https://cdn.jsdelivr.net/gh/DNSCrypt/dnscrypt-resolvers@master/v3/public-resolvers.md&amp;#39&lt;/a&gt;;&lt;br/&gt;]&lt;br/&gt;cache_file = &amp;#39;public-resolvers.md&amp;#39;&lt;br/&gt;minisign_key = &amp;#39;RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3&amp;#39;&lt;br/&gt;refresh_delay = 73&lt;br/&gt;prefix = &amp;#39;&amp;#39;&lt;br/&gt;&lt;br/&gt;[sources.relays]&lt;br/&gt;urls = [&lt;br/&gt;    &amp;#39;&lt;a href=&#34;https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/relays.md&amp;#39&#34;&gt;https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/relays.md&amp;#39&lt;/a&gt;;,&lt;br/&gt;    &amp;#39;&lt;a href=&#34;https://download.dnscrypt.info/resolvers-list/v3/relays.md&amp;#39&#34;&gt;https://download.dnscrypt.info/resolvers-list/v3/relays.md&amp;#39&lt;/a&gt;;,&lt;br/&gt;    &amp;#39;&lt;a href=&#34;https://cdn.jsdelivr.net/gh/DNSCrypt/dnscrypt-resolvers@master/v3/relays.md&amp;#39&#34;&gt;https://cdn.jsdelivr.net/gh/DNSCrypt/dnscrypt-resolvers@master/v3/relays.md&amp;#39&lt;/a&gt;;&lt;br/&gt;]&lt;br/&gt;cache_file = &amp;#39;relays.md&amp;#39;&lt;br/&gt;minisign_key = &amp;#39;RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3&amp;#39;&lt;br/&gt;refresh_delay = 73&lt;br/&gt;prefix = &amp;#39;&amp;#39;&lt;br/&gt;&lt;br/&gt;[anonymized_dns]&lt;br/&gt;routes = [&lt;br/&gt;    { server_name=&amp;#39;*&amp;#39;, via=[&amp;#39;anon-scaleway&amp;#39;, &amp;#39;anon-scaleway-ams&amp;#39;, &amp;#39;anon-kama&amp;#39;, &amp;#39;anon-tiarap&amp;#39;] }&lt;br/&gt;]&lt;br/&gt;skip_incompatible = true&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;    Note: The 10.139.1.1 and 10.139.1.2 addresses are the standard Qubes OS DNS IPs assigned to downstream VMs. Binding to 0.0.0.0:53 ensures dnscrypt-proxy can accept queries on these interfaces.&lt;br/&gt;&lt;br/&gt;3. Create and configure sys-dns qube:&lt;br/&gt;&lt;br/&gt;Create fedora-based AppVM sys-dns and add option Provides network in Qube Manager (advansed settings)&lt;br/&gt;&lt;br/&gt;The next commands are executed in the sys-dns terminal.&lt;br/&gt;&lt;br/&gt;4. Disable systemd-resolved in sys-dns:&lt;br/&gt;&lt;br/&gt;sudo tee /rw/config/rc.local &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;# Disable systemd-resolved to free up port 53&lt;br/&gt;systemctl stop systemd-resolved 2&amp;gt;/dev/null&lt;br/&gt;systemctl disable systemd-resolved 2&amp;gt;/dev/null&lt;br/&gt;systemctl mask systemd-resolved 2&amp;gt;/dev/null&lt;br/&gt;&lt;br/&gt;systemctl stop systemd-resolved-varlink.socket 2&amp;gt;/dev/null&lt;br/&gt;systemctl disable systemd-resolved-varlink.socket 2&amp;gt;/dev/null&lt;br/&gt;systemctl mask systemd-resolved-varlink.socket 2&amp;gt;/dev/null&lt;br/&gt;&lt;br/&gt;systemctl stop systemd-resolved-monitor.socket 2&amp;gt;/dev/null&lt;br/&gt;systemctl disable systemd-resolved-monitor.socket 2&amp;gt;/dev/null&lt;br/&gt;systemctl mask systemd-resolved-monitor.socket 2&amp;gt;/dev/null&lt;br/&gt;&lt;br/&gt;# Assign Qubes standard DNS IPs to eth0 for downstream VMs&lt;br/&gt;# These IPs are dynamically provided to downstream qubes via Qubes mechanisms&lt;br/&gt;ip addr add 10.139.1.1/32 dev eth0 2&amp;gt;/dev/null&lt;br/&gt;ip addr add 10.139.1.2/32 dev eth0 2&amp;gt;/dev/null&lt;br/&gt;&lt;br/&gt;# start dnscrypt-proxy (let&amp;#39;s add it just in case)&lt;br/&gt;systemctl start dnscrypt-proxy&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;5. Configure nftables (Accept Rules for DNS) in sys-dns:&lt;br/&gt;&lt;br/&gt;sudo tee /rw/config/qubes-firewall-user-script &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;# Allow DNS queries from downstream qubes to 10.139.1.1/2&lt;br/&gt;# vif* are interfaces for downstream qubes, group 2&lt;br/&gt;nft add rule ip qubes custom-input iifgroup 2 ip daddr { 10.139.1.1, 10.139.1.2 } udp dport 53 accept 2&amp;gt;/dev/null&lt;br/&gt;nft add rule ip qubes custom-input iifgroup 2 ip daddr { 10.139.1.1, 10.139.1.2 } tcp dport 53 accept 2&amp;gt;/dev/null&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;Restart sys-dns to apply all changes.
    </content>
    <updated>2026-07-19T12:57:25Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqstdmufweryc4lxyqlqpmntchdu8gwgd35crv0jmw3uu05v4rn9engzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630328ahtj9</id>
    
      <title type="html">Qubes OS live mode. dom0 in RAM. Non-persistent Boot. RAM-Wipe. ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqstdmufweryc4lxyqlqpmntchdu8gwgd35crv0jmw3uu05v4rn9engzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630328ahtj9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsfq3hk6w9jjv0mg7s3zd9dp0w2526u0wuvduj48k4d0yw8lwed9jsppemhxue69uhkummn9ekx7mp0jgvhtk&#39;&gt;nevent1q…vhtk&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Qubes OS live mode. dom0 in RAM. Non-persistent Boot. RAM-Wipe. Protection against forensics. Tails mode. Hardening dom0. Root read‑only. Paranoid Security. Ephemeral Encryption&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;# Qubes Dom0 Amnesic modes&lt;br/&gt;# ⚠ Make backup before running! Run as root: sudo ./amnesic.sh&lt;br/&gt;echo &amp;#34;=== Qubes Dom0 Live Boot Setup ===&amp;#34;&lt;br/&gt;&lt;br/&gt;#BOOT_UUID&lt;br/&gt;BOOT_UUID=$(findmnt -n -o UUID /boot 2&amp;gt;/dev/null || echo &amp;#34;AUTO_BOOT_NOT_FOUND&amp;#34;)&lt;br/&gt;if [ &amp;#34;$BOOT_UUID&amp;#34; = &amp;#34;AUTO_BOOT_NOT_FOUND&amp;#34; ]; then&lt;br/&gt;    BOOT_UUID=$(blkid -s UUID -o value -d $(findmnt -n -o SOURCE /boot 2&amp;gt;/dev/null))&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# LUKS_UUID&lt;br/&gt;LUKS_DEVICE=$(blkid -t TYPE=&amp;#34;crypto_LUKS&amp;#34; -o device 2&amp;gt;/dev/null | head -n1 || echo &amp;#34;&amp;#34;)&lt;br/&gt;if [ -n &amp;#34;$LUKS_DEVICE&amp;#34; ]; then&lt;br/&gt;    LUKS_UUID=$(sudo cryptsetup luksUUID &amp;#34;$LUKS_DEVICE&amp;#34; 2&amp;gt;/dev/null)&lt;br/&gt;else&lt;br/&gt;    LUKS_UUID=&amp;#34;AUTO_LUKS_NOT_FOUND&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# Latest XEN_PATH &lt;br/&gt;XEN_PATH=$(ls /boot/xen*.gz 2&amp;gt;/dev/null | sort -V | tail -1 | xargs basename 2&amp;gt;/dev/null || echo &amp;#34;/xen-4.19.4.gz&amp;#34;)&lt;br/&gt;&lt;br/&gt;# Latest kernel/initramfs&lt;br/&gt;LATEST_KERNEL=$(ls /boot/vmlinuz-*qubes*.x86_64 2&amp;gt;/dev/null | grep -E &amp;#39;qubes\.fc[0-9]&#43;&amp;#39; | sort -V | tail -1 | xargs basename)&lt;br/&gt;LATEST_INITRAMFS=$(echo &amp;#34;/initramfs-${LATEST_KERNEL#vmlinuz-}.img&amp;#34;)&lt;br/&gt;&lt;br/&gt;# Max memory dom0&lt;br/&gt;system_total_mb=$(xl info | grep total_memory | awk &amp;#39;{print $3}&amp;#39;)&lt;br/&gt;&lt;br/&gt;if [ -n &amp;#34;$system_total_mb&amp;#34; ] &amp;amp;&amp;amp; [ &amp;#34;$system_total_mb&amp;#34; -gt 0 ] 2&amp;gt;/dev/null; then&lt;br/&gt;    # 80% total_memory&lt;br/&gt;    DOM0_MAX_MB=$((system_total_mb * 80 / 100))&lt;br/&gt;    DOM0_MAX_GB=$((DOM0_MAX_MB / 1024))&lt;br/&gt;    DOM0_MAX_RAM=&amp;#34;dom0_mem=max:${DOM0_MAX_MB}M&amp;#34;&lt;br/&gt;    DOM0_MAX_GBG=&amp;#34;${DOM0_MAX_GB}G&amp;#34;&lt;br/&gt;else&lt;br/&gt;    DOM0_MAX_RAM=&amp;#34;dom0_mem=max:10240M&amp;#34;&lt;br/&gt;    DOM0_MAX_GB=&amp;#34;10&amp;#34;&lt;br/&gt;    DOM0_MAX_GBG=&amp;#34;10G&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# qubes_dom0-root&lt;br/&gt;Qubes_Root=$(findmnt -n -o SOURCE /)&lt;br/&gt;&lt;br/&gt;# /home/user&lt;br/&gt;if [ -n &amp;#34;$SUDO_USER&amp;#34; ] &amp;amp;&amp;amp; [ &amp;#34;$SUDO_USER&amp;#34; != &amp;#34;root&amp;#34; ]; then&lt;br/&gt;    USER_HOME=$(getent passwd &amp;#34;$SUDO_USER&amp;#34; | cut -d: -f6)&lt;br/&gt;else&lt;br/&gt;    USER_HOME=&amp;#34;$HOME&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;if [ ! -d &amp;#34;$USER_HOME&amp;#34; ]; then&lt;br/&gt;    echo &amp;#34;home dir &amp;#39;$USER_HOME&amp;#39; not found!&amp;#34; &amp;gt;&amp;amp;2&lt;br/&gt;    exit 1&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === dom0 resize ===&lt;br/&gt;&lt;br/&gt;REQUIRED_FREE_GB=100&lt;br/&gt;MIN_DOM0_SIZE_GB=40&lt;br/&gt;&lt;br/&gt;get_dom0_size_gb() {&lt;br/&gt;    local size_bytes&lt;br/&gt;    size_bytes=$(df -B1 /dev/mapper/qubes_dom0-root 2&amp;gt;/dev/null | awk &amp;#39;NR==2 {print $2}&amp;#39;)&lt;br/&gt;    if [[ -z &amp;#34;$size_bytes&amp;#34; ]]; then&lt;br/&gt;        echo &amp;#34;Warning: failed to determine dom0 size&amp;#34; &amp;gt;&amp;amp;2&lt;br/&gt;        return 1&lt;br/&gt;    fi&lt;br/&gt;    echo &amp;#34;$((size_bytes / 1024 / 1024 / 1024))&amp;#34;&lt;br/&gt;    return 0&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;get_vg_free_gb() {&lt;br/&gt;    local lv_size data_pct&lt;br/&gt;    lv_size=$(lvs --noheadings --nosuffix --units b -o lv_size qubes_dom0/vm-pool 2&amp;gt;/dev/null | tr -dc &amp;#39;0-9&amp;#39;)&lt;br/&gt;    data_pct=$(lvs --noheadings -o data_percent qubes_dom0/vm-pool 2&amp;gt;/dev/null | tr &amp;#39;,&amp;#39; &amp;#39;.&amp;#39; | tr -dc &amp;#39;0-9.&amp;#39;)&lt;br/&gt;&lt;br/&gt;    if [[ -z &amp;#34;$lv_size&amp;#34; || -z &amp;#34;$data_pct&amp;#34; ]]; then&lt;br/&gt;        echo &amp;#34;Warning: failed to determine free space in vm-pool&amp;#34; &amp;gt;&amp;amp;2&lt;br/&gt;        return 1&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    local free_gb&lt;br/&gt;    free_gb=$(awk &amp;#34;BEGIN { printf \&amp;#34;%.0f\&amp;#34;, ($lv_size * (100 - $data_pct) / 100) / 1024 / 1024 / 1024 }&amp;#34;)&lt;br/&gt;    echo &amp;#34;$free_gb&amp;#34;&lt;br/&gt;    return 0&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;main() {&lt;br/&gt;    if [[ &amp;#34;$EUID&amp;#34; -ne 0 ]]; then&lt;br/&gt;        echo &amp;#34;Warning: This script should be run as root (sudo)&amp;#34; &amp;gt;&amp;amp;2&lt;br/&gt;        # Changed from exit 1 to just warning&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    local dom0_size_gb vg_free_gb&lt;br/&gt;    dom0_size_gb=$(get_dom0_size_gb) || dom0_size_gb=&amp;#34;unknown&amp;#34;&lt;br/&gt;    vg_free_gb=$(get_vg_free_gb) || vg_free_gb=&amp;#34;unknown&amp;#34;&lt;br/&gt;&lt;br/&gt;    echo &amp;#34;Current dom0 size: ${dom0_size_gb} GB&amp;#34;&lt;br/&gt;    echo &amp;#34;Free space in VM pool: ${vg_free_gb} GB&amp;#34;&lt;br/&gt;&lt;br/&gt;    if [[ &amp;#34;$vg_free_gb&amp;#34; != &amp;#34;unknown&amp;#34; ]] &amp;amp;&amp;amp; ((vg_free_gb &amp;lt; REQUIRED_FREE_GB)); then&lt;br/&gt;        echo &amp;#34;Info: free space is less than ${REQUIRED_FREE_GB} GB (available: ${vg_free_gb} GB) - skipping resize&amp;#34;&lt;br/&gt;        # Changed from exit 0 to continue&lt;br/&gt;    elif [[ &amp;#34;$dom0_size_gb&amp;#34; != &amp;#34;unknown&amp;#34; ]] &amp;amp;&amp;amp; ((dom0_size_gb &amp;gt;= MIN_DOM0_SIZE_GB)); then&lt;br/&gt;        echo &amp;#34;Info: dom0 size is already ${dom0_size_gb} GB (&amp;gt;= ${MIN_DOM0_SIZE_GB} GB) - skipping resize&amp;#34;&lt;br/&gt;        # Changed from exit 0 to continue&lt;br/&gt;    else&lt;br/&gt;        echo &amp;#34;Conditions met. Starting dom0 resize...&amp;#34;&lt;br/&gt;&lt;br/&gt;        if lvresize --size 40G /dev/mapper/qubes_dom0-root; then&lt;br/&gt;            resize2fs /dev/mapper/qubes_dom0-root&lt;br/&gt;            lvresize -L &#43;20G qubes_dom0/root-pool&lt;br/&gt;            echo &amp;#34;Done. New dom0 size: $(get_dom0_size_gb) GB&amp;#34;&lt;br/&gt;        else&lt;br/&gt;            echo &amp;#34;Warning: dom0 resize failed - continuing with other commands&amp;#34;&lt;br/&gt;        fi&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    echo &amp;#34;--- dom0 resize completed ---&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;main &amp;#34;$@&amp;#34;&lt;br/&gt;&lt;br/&gt;# === swapoff ===&lt;br/&gt;sudo sed -i &amp;#39;/\/dev\/mapper\/swap/!{/^[[:space:]]*#/!{/\&amp;lt;swap\&amp;gt;/s/^/# /}}&amp;#39; /etc/fstab&lt;br/&gt;sudo sed -i &amp;#39;/\/dev\/mapper\/swap/b; /[[:space:]]\&#43;swap[[:space:]]\&#43;/s/^/# /&amp;#39; /etc/fstab&lt;br/&gt;&lt;br/&gt;# === harden autostart ===&lt;br/&gt;mkdir -p &amp;#34;$USER_HOME/.config&amp;#34;&lt;br/&gt;if [ ! -f &amp;#34;$USER_HOME/.config/harden.sh&amp;#34; ]; then&lt;br/&gt;    cat &amp;gt; &amp;#34;$USER_HOME/.config/harden.sh&amp;#34; &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;sleep 1&lt;br/&gt;if findmnt -n -o SOURCE / | grep -qE &amp;#34;(overlay|/dev/zram0)&amp;#34;; then&lt;br/&gt;    notify-send --expire-time=20000 &amp;#34;Amnesic session is running&amp;#34; &amp;#34;dom0 mode: $(findmnt -n -o SOURCE /)&amp;#34; --icon=dialog-information&lt;br/&gt;    sleep 10&lt;br/&gt;    sudo sysctl -w kernel.sysrq=0&lt;br/&gt;    sudo sysctl -w kernel.perf_event_paranoid=3&lt;br/&gt;    sudo sysctl -w kernel.kptr_restrict=2&lt;br/&gt;    sudo sysctl -w kernel.panic=5&lt;br/&gt;    sudo sysctl -w fs.protected_regular=2&lt;br/&gt;    sudo sysctl -w fs.protected_fifos=2&lt;br/&gt;    sudo sysctl -w kernel.printk=&amp;#34;3 3 3 3&amp;#34;&lt;br/&gt;    sudo sysctl -w kernel.kexec_load_disabled=1&lt;br/&gt;    sudo sysctl -w kernel.io_uring_disabled=2&lt;br/&gt;    sudo chattr &#43;i /boot/grub2/grub.cfg&lt;br/&gt;    sudo chattr &#43;i /boot&lt;br/&gt;else&lt;br/&gt;    sudo chattr -i /boot/grub2/grub.cfg&lt;br/&gt;    sudo chattr -i /boot&lt;br/&gt;fi&lt;br/&gt;EOF&lt;br/&gt;    chmod 755 &amp;#34;$USER_HOME/.config/harden.sh&amp;#34;&lt;br/&gt;    echo &amp;#34;Created harden.sh&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;harden.sh already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === autostart desktop entry ===&lt;br/&gt;mkdir -p &amp;#34;$USER_HOME/.config/autostart&amp;#34;&lt;br/&gt;if [ ! -f &amp;#34;$USER_HOME/.config/autostart/harden.desktop&amp;#34; ]; then&lt;br/&gt;    cat &amp;gt; &amp;#34;$USER_HOME/.config/autostart/harden.desktop&amp;#34; &amp;lt;&amp;lt; EOF&lt;br/&gt;[Desktop Entry]&lt;br/&gt;Encoding=UTF-8&lt;br/&gt;Version=0.9.4&lt;br/&gt;Type=Application&lt;br/&gt;Name=harden&lt;br/&gt;Comment=&lt;br/&gt;Exec=$USER_HOME/.config/harden.sh&lt;br/&gt;OnlyShowIn=XFCE;&lt;br/&gt;RunHook=0&lt;br/&gt;StartupNotify=false&lt;br/&gt;Terminal=false&lt;br/&gt;Hidden=false&lt;br/&gt;EOF&lt;br/&gt;    echo &amp;#34;Created harden.desktop&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;harden.desktop already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === Dracut module directories ===&lt;br/&gt;DIR_OVERLAY_CRYPT=/usr/lib/dracut/modules.d/90overlay-crypt&lt;br/&gt;DIR_RAMBOOT=/usr/lib/dracut/modules.d/90ramboot&lt;br/&gt;DIR_OVERLAY=/usr/lib/dracut/modules.d/90overlayfs-root&lt;br/&gt;DIR_RAMWIPE=/usr/lib/dracut/modules.d/40ram-wipe&lt;br/&gt;&lt;br/&gt;for d in &amp;#34;$DIR_RAMBOOT&amp;#34; &amp;#34;$DIR_OVERLAY&amp;#34; &amp;#34;$DIR_RAMWIPE&amp;#34; &amp;#34;$DIR_OVERLAY_CRYPT&amp;#34;; do&lt;br/&gt;    if [ ! -d &amp;#34;$d&amp;#34; ]; then&lt;br/&gt;        mkdir -p &amp;#34;$d&amp;#34;&lt;br/&gt;        echo &amp;#34;Created $(basename &amp;#34;$d&amp;#34;)&amp;#34;&lt;br/&gt;    else&lt;br/&gt;        echo &amp;#34;$(basename &amp;#34;$d&amp;#34;) already exists, skipping&amp;#34;&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;# === 90overlay-crypt/module-setup.sh ===&lt;br/&gt;if [ ! -f &amp;#34;$DIR_OVERLAY_CRYPT/module-setup.sh&amp;#34; ]; then&lt;br/&gt;    cat &amp;gt; &amp;#34;$DIR_OVERLAY_CRYPT/module-setup.sh&amp;#34; &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!#!/bin/bash&lt;br/&gt;&lt;br/&gt;check() {&lt;br/&gt;    require_binaries cryptsetup || return 1&lt;br/&gt;    require_binaries losetup || return 1&lt;br/&gt;    require_binaries mkfs.ext4 || return 1&lt;br/&gt;    return 0&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;depends() {&lt;br/&gt;    return 0&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;installkernel() {&lt;br/&gt;    hostonly=&amp;#39;&amp;#39; instmods overlay 2&amp;gt;/dev/null || true&lt;br/&gt;    hostonly=&amp;#39;&amp;#39; instmods dm-crypt 2&amp;gt;/dev/null || true&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;install() {&lt;br/&gt;    inst_multiple cryptsetup losetup mkfs.ext4 dd modprobe mount umount shred&lt;br/&gt;    inst_hook pre-pivot 10 &amp;#34;$moddir/overlay-crypt.sh&amp;#34;&lt;br/&gt;}&lt;br/&gt;EOF&lt;br/&gt;    chmod 755 &amp;#34;$DIR_OVERLAY_CRYPT/module-setup.sh&amp;#34;&lt;br/&gt;    echo &amp;#34;Created 90overlay-crypt/module-setup.sh&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;90overlay-crypt/module-setup.sh already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === 90overlay-crypt/overlay-crypt.sh ===&lt;br/&gt;if [ ! -f &amp;#34;$DIR_OVERLAY_CRYPT/overlay-crypt.sh&amp;#34; ]; then&lt;br/&gt;    cat &amp;gt; &amp;#34;$DIR_OVERLAY_CRYPT/overlay-crypt.sh&amp;#34; &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;. /lib/dracut-lib.sh&lt;br/&gt;&lt;br/&gt;if ! getargbool 0 cryptovl ; then&lt;br/&gt;    return&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;modprobe overlay 2&amp;gt;/dev/null || true&lt;br/&gt;modprobe dm-crypt 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;#&lt;br/&gt;mount -o remount,ro /sysroot 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;# &lt;br/&gt;mkdir -p /live/image&lt;br/&gt;mount --bind /sysroot /live/image&lt;br/&gt;umount /sysroot&lt;br/&gt;&lt;br/&gt;# &lt;br/&gt;dd if=/dev/urandom bs=64 count=1 of=/dev/shm/overlay-key status=none&lt;br/&gt;chmod 600 /dev/shm/overlay-key&lt;br/&gt;&lt;br/&gt;# create 20 GB size (seek)&lt;br/&gt;mkdir -p /var/lib&lt;br/&gt;dd if=/dev/zero of=/var/lib/overlay-crypt.img bs=1M count=0 seek=20480 status=none&lt;br/&gt;&lt;br/&gt;# &lt;br/&gt;losetup -f&lt;br/&gt;LOOP_DEV=$(losetup -f --show /var/lib/overlay-crypt.img)&lt;br/&gt;&lt;br/&gt;# &lt;br/&gt;cryptsetup luksFormat --type luks2 \&lt;br/&gt;    --cipher aes-xts-plain64 --key-size 512 \&lt;br/&gt;    --hash sha256 --pbkdf pbkdf2 --pbkdf-force-iterations 1000 \&lt;br/&gt;    --batch-mode --key-file /dev/shm/overlay-key &amp;#34;$LOOP_DEV&amp;#34;&lt;br/&gt;&lt;br/&gt;# &lt;br/&gt;cryptsetup open --type luks2 --key-file /dev/shm/overlay-key &amp;#34;$LOOP_DEV&amp;#34; overlaycrypt&lt;br/&gt;&lt;br/&gt;# &lt;br/&gt;mkfs.ext4 -F -L &amp;#34;overlaycrypt&amp;#34; /dev/mapper/overlaycrypt&lt;br/&gt;&lt;br/&gt;# &lt;br/&gt;mkdir -p /cow&lt;br/&gt;mount -o noatime,nodiratime,nobarrier /dev/mapper/overlaycrypt /cow&lt;br/&gt;mkdir -p /cow/work /cow/rw&lt;br/&gt;&lt;br/&gt;# &lt;br/&gt;mount -t overlay -o noatime,nodiratime,volatile,lowerdir=/live/image,upperdir=/cow/rw,workdir=/cow/work,default_permissions,relatime overlay /sysroot&lt;br/&gt;&lt;br/&gt;# &lt;br/&gt;mkdir -p /sysroot/live/cow /sysroot/live/image&lt;br/&gt;mount --bind /cow/rw /sysroot/live/cow&lt;br/&gt;mount --bind /live/image /sysroot/live/image&lt;br/&gt;&lt;br/&gt;# &lt;br/&gt;umount /cow 2&amp;gt;/dev/null || true&lt;br/&gt;umount /live/image 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;# &lt;br/&gt;shred -u /dev/shm/overlay-key 2&amp;gt;/dev/null || rm -f /dev/shm/overlay-key&lt;br/&gt;EOF&lt;br/&gt;    chmod 755 &amp;#34;$DIR_OVERLAY_CRYPT/overlay-crypt.sh&amp;#34;&lt;br/&gt;    echo &amp;#34;Created 90overlay-crypt/overlay-crypt.sh&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;90overlay-crypt/overlay-crypt.sh already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === 90ramboot/module-setup.sh ===&lt;br/&gt;if [ ! -f &amp;#34;$DIR_RAMBOOT/module-setup.sh&amp;#34; ]; then&lt;br/&gt;    cat &amp;gt; &amp;#34;$DIR_RAMBOOT/module-setup.sh&amp;#34; &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/usr/bin/bash&lt;br/&gt;check() {&lt;br/&gt;    return 0&lt;br/&gt;}&lt;br/&gt;depends() {&lt;br/&gt;    return 0&lt;br/&gt;}&lt;br/&gt;install() {&lt;br/&gt;    inst_simple &amp;#34;$moddir/zram-mount.sh&amp;#34;&lt;br/&gt;    inst_hook cleanup 00 &amp;#34;$moddir/zram-mount.sh&amp;#34;&lt;br/&gt;}&lt;br/&gt;EOF&lt;br/&gt;    chmod 755 &amp;#34;$DIR_RAMBOOT/module-setup.sh&amp;#34;&lt;br/&gt;    echo &amp;#34;Created 90ramboot/module-setup.sh&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;90ramboot/module-setup.sh already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === 90ramboot/zram-mount.sh ===&lt;br/&gt;if [ ! -f &amp;#34;$DIR_RAMBOOT/zram-mount.sh&amp;#34; ]; then&lt;br/&gt;    cat &amp;gt; &amp;#34;$DIR_RAMBOOT/zram-mount.sh&amp;#34; &amp;lt;&amp;lt; EOF&lt;br/&gt;#!/bin/sh&lt;br/&gt;&lt;br/&gt;. /lib/dracut-lib.sh&lt;br/&gt;&lt;br/&gt;if ! getargbool 0 rootzram ; then&lt;br/&gt;    return&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;mkdir /mnt&lt;br/&gt;umount /sysroot&lt;br/&gt;mount -o ro $Qubes_Root /mnt&lt;br/&gt;modprobe zram&lt;br/&gt;echo $DOM0_MAX_GBG &amp;gt; /sys/block/zram0/disksize&lt;br/&gt;/mnt/usr/sbin/mkfs.ext2 /dev/zram0&lt;br/&gt;mount -o nodev,nosuid,noatime,nodiratime /dev/zram0 /sysroot&lt;br/&gt;cp -a /mnt/* /sysroot&lt;br/&gt;umount /mnt&lt;br/&gt;exit 0&lt;br/&gt;EOF&lt;br/&gt;    chmod 755 &amp;#34;$DIR_RAMBOOT/zram-mount.sh&amp;#34;&lt;br/&gt;    echo &amp;#34;Created 90ramboot/zram-mount.sh&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;90ramboot/zram-mount.sh already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === 90overlayfs-root/module-setup.sh ===&lt;br/&gt;if [ ! -f &amp;#34;$DIR_OVERLAY/module-setup.sh&amp;#34; ]; then&lt;br/&gt;    cat &amp;gt; &amp;#34;$DIR_OVERLAY/module-setup.sh&amp;#34; &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;check() {&lt;br/&gt;    [ -d /lib/modules/$kernel/kernel/fs/overlayfs ] || return 1&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;depends() {&lt;br/&gt;    return 0&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;installkernel() {&lt;br/&gt;    hostonly=&amp;#39;&amp;#39; instmods overlay&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;install() {&lt;br/&gt;    inst_hook pre-pivot 10 &amp;#34;$moddir/overlay-mount.sh&amp;#34;&lt;br/&gt;}&lt;br/&gt;EOF&lt;br/&gt;    chmod 755 &amp;#34;$DIR_OVERLAY/module-setup.sh&amp;#34;&lt;br/&gt;    echo &amp;#34;Created 90overlayfs-root/module-setup.sh&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;90overlayfs-root/module-setup.sh already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === 90overlayfs-root/overlay-mount.sh ===&lt;br/&gt;if [ ! -f &amp;#34;$DIR_OVERLAY/overlay-mount.sh&amp;#34; ]; then&lt;br/&gt;    cat &amp;gt; &amp;#34;$DIR_OVERLAY/overlay-mount.sh&amp;#34; &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/sh&lt;br/&gt;. /lib/dracut-lib.sh&lt;br/&gt;&lt;br/&gt;if ! getargbool 0 rootovl ; then&lt;br/&gt;    return&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;modprobe overlay&lt;br/&gt;mount -o remount,nolock,noatime $NEWROOT&lt;br/&gt;mkdir -p /live/image&lt;br/&gt;mount --bind $NEWROOT /live/image&lt;br/&gt;umount $NEWROOT&lt;br/&gt;mkdir /cow&lt;br/&gt;mount -n -t tmpfs -o mode=0755,size=100%,nr_inodes=500k,noexec,nodev,nosuid,noatime,nodiratime tmpfs /cow&lt;br/&gt;mkdir /cow/work /cow/rw&lt;br/&gt;mount -t overlay -o noatime,nodiratime,volatile,lowerdir=/live/image,upperdir=/cow/rw,workdir=/cow/work,default_permissions,relatime overlay $NEWROOT&lt;br/&gt;mkdir -p $NEWROOT/live/cow&lt;br/&gt;mkdir -p $NEWROOT/live/image&lt;br/&gt;mount --bind /cow/rw $NEWROOT/live/cow&lt;br/&gt;umount /cow&lt;br/&gt;mount --bind /live/image $NEWROOT/live/image&lt;br/&gt;umount /live/image&lt;br/&gt;umount $NEWROOT/live/cow&lt;br/&gt;EOF&lt;br/&gt;    chmod 755 &amp;#34;$DIR_OVERLAY/overlay-mount.sh&amp;#34;&lt;br/&gt;    echo &amp;#34;Created 90overlayfs-root/overlay-mount.sh&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;90overlayfs-root/overlay-mount.sh already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === ramboot dracut.conf ===&lt;br/&gt;if [ ! -f /etc/dracut.conf.d/ramboot.conf ]; then&lt;br/&gt;    cat &amp;gt; /etc/dracut.conf.d/ramboot.conf &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;add_drivers&#43;=&amp;#34; zram &amp;#34;&lt;br/&gt;add_dracutmodules&#43;=&amp;#34; ramboot &amp;#34;&lt;br/&gt;EOF&lt;br/&gt;    echo &amp;#34;Created ramboot.conf&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;ramboot.conf already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === 40ram-wipe/module-setup.sh ===&lt;br/&gt;if [ ! -f &amp;#34;$DIR_RAMWIPE/module-setup.sh&amp;#34; ]; then&lt;br/&gt;    cat &amp;gt; &amp;#34;$DIR_RAMWIPE/module-setup.sh&amp;#34; &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-&lt;br/&gt;# ex: ts=8 sw=4 sts=4 et filetype=sh&lt;br/&gt;&lt;br/&gt;## Copyright (C) 2023 - 2025 ENCRYPTED SUPPORT LLC &amp;lt;adrelanos@whonix.org&amp;gt;&lt;br/&gt;## See the file COPYING for copying conditions.&lt;br/&gt;&lt;br/&gt;check() {&lt;br/&gt;   require_binaries sync || return 1&lt;br/&gt;   require_binaries sleep || return 1&lt;br/&gt;   require_binaries dmsetup || return 1&lt;br/&gt;   return 0&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;depends() {&lt;br/&gt;   return 0&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;install() {&lt;br/&gt;   inst_simple &amp;#34;/usr/libexec/ram-wipe/ram-wipe-lib.sh&amp;#34; &amp;#34;/lib/ram-wipe-lib.sh&amp;#34;&lt;br/&gt;   inst_multiple sync&lt;br/&gt;   inst_multiple sleep&lt;br/&gt;   inst_multiple dmsetup&lt;br/&gt;   inst_hook shutdown 40 &amp;#34;$moddir/wipe-ram.sh&amp;#34;&lt;br/&gt;   inst_hook cleanup 80 &amp;#34;$moddir/wipe-ram-needshutdown.sh&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;installkernel() {&lt;br/&gt;   return 0&lt;br/&gt;}&lt;br/&gt;EOF&lt;br/&gt;    chmod &#43;x &amp;#34;$DIR_RAMWIPE/module-setup.sh&amp;#34;&lt;br/&gt;    echo &amp;#34;Created 40ram-wipe/module-setup.sh&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;40ram-wipe/module-setup.sh already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === 40ram-wipe/wipe-ram-needshutdown.sh ===&lt;br/&gt;if [ ! -f &amp;#34;$DIR_RAMWIPE/wipe-ram-needshutdown.sh&amp;#34; ]; then&lt;br/&gt;    cat &amp;gt; &amp;#34;$DIR_RAMWIPE/wipe-ram-needshutdown.sh&amp;#34; &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/sh&lt;br/&gt;&lt;br/&gt;## Copyright (C) 2023 - 2025 ENCRYPTED SUPPORT LLC &amp;lt;adrelanos@whonix.org&amp;gt;&lt;br/&gt;## See the file COPYING for copying conditions.&lt;br/&gt;&lt;br/&gt;type getarg &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 || . /lib/dracut-lib.sh&lt;br/&gt;&lt;br/&gt;. /lib/ram-wipe-lib.sh&lt;br/&gt;&lt;br/&gt;ram_wipe_check_needshutdown() {&lt;br/&gt;   #local kernel_wiperam_setting&lt;br/&gt;&lt;br/&gt;   kernel_wiperam_setting=&amp;#34;$(getarg wiperam)&amp;#34;&lt;br/&gt;&lt;br/&gt;   if [ &amp;#34;$kernel_wiperam_setting&amp;#34; = &amp;#34;skip&amp;#34; ]; then&lt;br/&gt;      force_echo &amp;#34;wipe-ram-needshutdown.sh: Skip, because wiperam=skip kernel parameter detected, OK.&amp;#34;&lt;br/&gt;      return 0&lt;br/&gt;   fi&lt;br/&gt;&lt;br/&gt;   true &amp;#34;wipe-ram-needshutdown.sh: Calling dracut function need_shutdown to drop back into initramfs at shutdown, OK.&amp;#34;&lt;br/&gt;   need_shutdown&lt;br/&gt;&lt;br/&gt;   return 0&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;ram_wipe_check_needshutdown&lt;br/&gt;EOF&lt;br/&gt;    chmod &#43;x &amp;#34;$DIR_RAMWIPE/wipe-ram-needshutdown.sh&amp;#34;&lt;br/&gt;    echo &amp;#34;Created 40ram-wipe/wipe-ram-needshutdown.sh&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;40ram-wipe/wipe-ram-needshutdown.sh already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === 40ram-wipe/wipe-ram.sh ===&lt;br/&gt;if [ ! -f &amp;#34;$DIR_RAMWIPE/wipe-ram.sh&amp;#34; ]; then&lt;br/&gt;    cat &amp;gt; &amp;#34;$DIR_RAMWIPE/wipe-ram.sh&amp;#34; &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/sh&lt;br/&gt;&lt;br/&gt;## Copyright (C) 2023 - 2025 ENCRYPTED SUPPORT LLC &amp;lt;adrelanos@whonix.org&amp;gt;&lt;br/&gt;## See the file COPYING for copying conditions.&lt;br/&gt;&lt;br/&gt;## Credits:&lt;br/&gt;## First version by @friedy10.&lt;br/&gt;## &lt;a href=&#34;https://github.com/friedy10/dracut/blob/master/modules.d/40sdmem/wipe.sh&#34;&gt;https://github.com/friedy10/dracut/blob/master/modules.d/40sdmem/wipe.sh&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;. /lib/ram-wipe-lib.sh&lt;br/&gt;&lt;br/&gt;drop_caches() {&lt;br/&gt;   sync&lt;br/&gt;   echo 3 &amp;gt; /proc/sys/vm/drop_caches&lt;br/&gt;   sync&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;ram_wipe() {&lt;br/&gt;   #local kernel_wiperam_setting&lt;br/&gt;&lt;br/&gt;   kernel_wiperam_setting=&amp;#34;$(getarg wiperam)&amp;#34;&lt;br/&gt;&lt;br/&gt;   if [ &amp;#34;$kernel_wiperam_setting&amp;#34; = &amp;#34;skip&amp;#34; ]; then&lt;br/&gt;      force_echo &amp;#34;wipe-ram.sh: Skip, because wiperam=skip kernel parameter detected, OK.&amp;#34;&lt;br/&gt;      return 0&lt;br/&gt;   fi&lt;br/&gt;&lt;br/&gt;   force_echo &amp;#34;wipe-ram.sh: RAM extraction attack defense... Starting RAM wipe pass during shutdown...&amp;#34;&lt;br/&gt;&lt;br/&gt;   drop_caches&lt;br/&gt;&lt;br/&gt;   force_echo &amp;#34;wipe-ram.sh: RAM wipe pass completed, OK.&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;ram_wipe&lt;br/&gt;EOF&lt;br/&gt;    chmod &#43;x &amp;#34;$DIR_RAMWIPE/wipe-ram.sh&amp;#34;&lt;br/&gt;    echo &amp;#34;Created 40ram-wipe/wipe-ram.sh&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;40ram-wipe/wipe-ram.sh already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === ram-wipe dracut.conf ===&lt;br/&gt;if [ ! -f /etc/dracut.conf.d/30-ram-wipe.conf ]; then&lt;br/&gt;    cat &amp;gt; /etc/dracut.conf.d/30-ram-wipe.conf &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;add_dracutmodules&#43;=&amp;#34; ram-wipe &amp;#34;&lt;br/&gt;EOF&lt;br/&gt;    echo &amp;#34;Created 30-ram-wipe.conf&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;30-ram-wipe.conf already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === ram-wipe-lib.sh ===&lt;br/&gt;DIR_RAMWIPE_LIB=/usr/libexec/ram-wipe&lt;br/&gt;if [ ! -d &amp;#34;$DIR_RAMWIPE_LIB&amp;#34; ]; then&lt;br/&gt;    mkdir -p &amp;#34;$DIR_RAMWIPE_LIB&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;if [ ! -f &amp;#34;$DIR_RAMWIPE_LIB/ram-wipe-lib.sh&amp;#34; ]; then&lt;br/&gt;    cat &amp;gt; &amp;#34;$DIR_RAMWIPE_LIB/ram-wipe-lib.sh&amp;#34; &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/sh&lt;br/&gt;&lt;br/&gt;## Copyright (C) 2023 - 2025 ENCRYPTED SUPPORT LLC &amp;lt;adrelanos@whonix.org&amp;gt;&lt;br/&gt;## See the file COPYING for copying conditions.&lt;br/&gt;&lt;br/&gt;if [ -z &amp;#34;$DRACUT_SYSTEMD&amp;#34; ]; then&lt;br/&gt;    force_echo() {&lt;br/&gt;        echo &amp;#34;&amp;lt;28&amp;gt;dracut INFO: $*&amp;#34; &amp;gt; /dev/kmsg&lt;br/&gt;        echo &amp;#34;dracut INFO: $*&amp;#34; &amp;gt;&amp;amp;2&lt;br/&gt;    }&lt;br/&gt;else&lt;br/&gt;    force_echo() {&lt;br/&gt;        echo &amp;#34;INFO: $*&amp;#34; &amp;gt;&amp;amp;2&lt;br/&gt;    }&lt;br/&gt;fi&lt;br/&gt;EOF&lt;br/&gt;    chmod &#43;x &amp;#34;$DIR_RAMWIPE_LIB/ram-wipe-lib.sh&amp;#34;&lt;br/&gt;    echo &amp;#34;Created ram-wipe-lib.sh&amp;#34;&lt;br/&gt;else&lt;br/&gt;    echo &amp;#34;ram-wipe-lib.sh already exists, skipping&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# Update INITRAMFS&lt;br/&gt;dracut --verbose --force&lt;br/&gt;&lt;br/&gt;# Create GRUB custom&lt;br/&gt;echo &amp;#34;Creating GRUB custom ...&amp;#34;&lt;br/&gt;&lt;br/&gt;cat &amp;gt; /etc/grub.d/40_custom &amp;lt;&amp;lt; EOF&lt;br/&gt;#!/usr/bin/sh&lt;br/&gt;exec tail -n &#43;3 \$0&lt;br/&gt;&lt;br/&gt;menuentry &amp;#39;Qubes Encrypted-Overlay Amnesic Mode&amp;#39; --class qubes --class gnu-linux --class gnu --class os --class xen \$menuentry_id_option &amp;#39;xen-gnulinux-simple-/dev/mapper/qubes_dom0-root&amp;#39; {&lt;br/&gt;	insmod part_gpt&lt;br/&gt;	insmod ext2&lt;br/&gt;	search --no-floppy --fs-uuid --set=root $BOOT_UUID&lt;br/&gt;	echo &amp;#39;Loading Xen ...&amp;#39;&lt;br/&gt;	if [ &amp;#34;\$grub_platform&amp;#34; = &amp;#34;pc&amp;#34; -o &amp;#34;\$grub_platform&amp;#34; = &amp;#34;&amp;#34; ]; then&lt;br/&gt;	    xen_rm_opts=&lt;br/&gt;	else&lt;br/&gt;	    xen_rm_opts=&amp;#34;no-real-mode edd=off&amp;#34;&lt;br/&gt;	fi&lt;br/&gt;	insmod multiboot2&lt;br/&gt;	multiboot2 /$XEN_PATH placeholder console=none dom0_mem=min:1024M $DOM0_MAX_RAM ucode=scan smt=off gnttab_max_frames=2048 gnttab_max_maptrack_frames=4096 \${xen_rm_opts}&lt;br/&gt;	echo &amp;#39;Loading Linux $LATEST_KERNEL ...&amp;#39;&lt;br/&gt;	module2 /$LATEST_KERNEL placeholder root=/dev/mapper/qubes_dom0-root ro rd.luks.uuid=$LUKS_UUID rd.lvm.lv=qubes_dom0/root rd.lvm.lv=qubes_dom0/swap plymouth.ignore-serial-consoles rhgb cryptovl quiet module.sig_enforce=1 bootscrub=on usbcore.authorized_default=0&lt;br/&gt;	echo &amp;#39;Loading initial ramdisk ...&amp;#39;&lt;br/&gt;	insmod multiboot2&lt;br/&gt;	module2 --nounzip $LATEST_INITRAMFS&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;menuentry &amp;#39;Qubes Zram-Live Amnesic Mode&amp;#39; --class qubes --class gnu-linux --class gnu --class os --class xen \$menuentry_id_option &amp;#39;xen-gnulinux-simple-/dev/mapper/qubes_dom0-root&amp;#39; {&lt;br/&gt;	insmod part_gpt&lt;br/&gt;	insmod ext2&lt;br/&gt;	search --no-floppy --fs-uuid --set=root $BOOT_UUID&lt;br/&gt;	echo &amp;#39;Loading Xen ...&amp;#39;&lt;br/&gt;	if [ &amp;#34;\$grub_platform&amp;#34; = &amp;#34;pc&amp;#34; -o &amp;#34;\$grub_platform&amp;#34; = &amp;#34;&amp;#34; ]; then&lt;br/&gt;	    xen_rm_opts=&lt;br/&gt;	else&lt;br/&gt;	    xen_rm_opts=&amp;#34;no-real-mode edd=off&amp;#34;&lt;br/&gt;	fi&lt;br/&gt;	insmod multiboot2&lt;br/&gt;	multiboot2 /$XEN_PATH placeholder console=none dom0_mem=min:1024M $DOM0_MAX_RAM ucode=scan smt=off gnttab_max_frames=2048 gnttab_max_maptrack_frames=4096 \${xen_rm_opts}&lt;br/&gt;	echo &amp;#39;Loading Linux $LATEST_KERNEL ...&amp;#39;&lt;br/&gt;	module2 /$LATEST_KERNEL placeholder root=/dev/mapper/qubes_dom0-root ro rd.luks.uuid=$LUKS_UUID rd.lvm.lv=qubes_dom0/root rd.lvm.lv=qubes_dom0/swap plymouth.ignore-serial-consoles rhgb rootzram quiet module.sig_enforce=1 bootscrub=on usbcore.authorized_default=0&lt;br/&gt;	echo &amp;#39;Loading initial ramdisk ...&amp;#39;&lt;br/&gt;	insmod multiboot2&lt;br/&gt;	module2 --nounzip $LATEST_INITRAMFS&lt;br/&gt;}&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;chmod 755  /etc/grub.d/40_custom&lt;br/&gt;&lt;br/&gt;# Update GRUB&lt;br/&gt;grub2-mkconfig -o /boot/grub2/grub.cfg&lt;br/&gt;&lt;br/&gt;echo&lt;br/&gt;echo &amp;#34;Done!&amp;#34;
    </content>
    <updated>2026-07-19T12:56:32Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsfq3hk6w9jjv0mg7s3zd9dp0w2526u0wuvduj48k4d0yw8lwed9jszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ghu79u</id>
    
      <title type="html">Топовые гайды по Qubes OS в комментах ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsfq3hk6w9jjv0mg7s3zd9dp0w2526u0wuvduj48k4d0yw8lwed9jszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ghu79u" />
    <content type="html">
      Топовые гайды по Qubes OS в комментах (шпаргалка, чтоб не потерять)
    </content>
    <updated>2026-07-19T12:55:25Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsgndjmertxk3vhl8afvuq8fp52kznd5yhdr276yy3saajsp3uvltgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032d6tps8</id>
    
      <title type="html">Более крутой подход к режиму ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsgndjmertxk3vhl8afvuq8fp52kznd5yhdr276yy3saajsp3uvltgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032d6tps8" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsg7mtkl6nvv9mszkmdrqs66s5sx2jj9t3544fd9z4mxmcq07mg5rgppemhxue69uhkummn9ekx7mp0k77605&#39;&gt;nevent1q…7605&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Более крутой подход к режиму несохранения - эфемерно зашифрованный dm-container вместо tmpfs. Это вообще не тратит ценную память телефона. Заранее установите sudo apt install e2fsprogs -y&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;# заранее установите sudo apt install e2fsprogs -y&lt;br/&gt;# === Конфигурация ===&lt;br/&gt;UPPER_BASE=&amp;#34;/mnt/overlay-persistent&amp;#34;&lt;br/&gt;DMCRYPT_FILE=&amp;#34;/var/lib/overlay-crypt.img&amp;#34;&lt;br/&gt;DMCRYPT_SIZE_MB=10240&lt;br/&gt;DMCRYPT_NAME=&amp;#34;overlaycrypt&amp;#34;&lt;br/&gt;STATE_FILE=&amp;#34;/run/overlay-active&amp;#34;&lt;br/&gt;TARGET_DIRS=&amp;#34;/etc /var /home /root /usr /opt /userdata&amp;#34;&lt;br/&gt;&lt;br/&gt;# === Проверка зависимостей ===&lt;br/&gt;for cmd in cryptsetup losetup mkfs.ext4 mount umount; do&lt;br/&gt;    if ! command -v &amp;#34;$cmd&amp;#34; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br/&gt;        echo &amp;#34;ERROR: Missing $cmd&amp;#34;&lt;br/&gt;        exit 1&lt;br/&gt;    fi&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;# === Проверка, не активен ли уже ===&lt;br/&gt;if [ -f &amp;#34;$STATE_FILE&amp;#34; ]; then&lt;br/&gt;    echo &amp;#34;Already active&amp;#34;&lt;br/&gt;    exit 0&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === Создание sparse-файла ===&lt;br/&gt;if [ ! -f &amp;#34;$DMCRYPT_FILE&amp;#34; ]; then&lt;br/&gt;    mkdir -p &amp;#34;$(dirname &amp;#34;$DMCRYPT_FILE&amp;#34;)&amp;#34;&lt;br/&gt;    dd if=/dev/zero of=&amp;#34;$DMCRYPT_FILE&amp;#34; bs=1M count=0 seek=&amp;#34;$DMCRYPT_SIZE_MB&amp;#34; status=progress&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === Loop-устройство ===&lt;br/&gt;LOOP_DEV=$(losetup -f --show &amp;#34;$DMCRYPT_FILE&amp;#34;)&lt;br/&gt;echo &amp;#34;Loop device: $LOOP_DEV&amp;#34;&lt;br/&gt;&lt;br/&gt;# === dm-crypt с случайным ключом ===&lt;br/&gt;cryptsetup open --type plain --key-file /dev/urandom \&lt;br/&gt;    --cipher aes-xts-plain64 --key-size 512 \&lt;br/&gt;    --sector-size 4096 &amp;#34;$LOOP_DEV&amp;#34; &amp;#34;$DMCRYPT_NAME&amp;#34;&lt;br/&gt;&lt;br/&gt;# === Форматирование ext4 ===&lt;br/&gt;if ! blkid &amp;#34;/dev/mapper/$DMCRYPT_NAME&amp;#34; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br/&gt;    mkfs.ext4 -F -L &amp;#34;overlaycrypt&amp;#34; &amp;#34;/dev/mapper/$DMCRYPT_NAME&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# === Монтирование контейнера ===&lt;br/&gt;mkdir -p &amp;#34;$UPPER_BASE&amp;#34;&lt;br/&gt;mount &amp;#34;/dev/mapper/$DMCRYPT_NAME&amp;#34; &amp;#34;$UPPER_BASE&amp;#34;&lt;br/&gt;&lt;br/&gt;# === Overlay на каждую директорию ===&lt;br/&gt;for dir in $TARGET_DIRS; do&lt;br/&gt;    name=$(echo &amp;#34;$dir&amp;#34; | tr &amp;#39;/&amp;#39; &amp;#39;-&amp;#39;)&lt;br/&gt;    upper=&amp;#34;$UPPER_BASE/$name-upper&amp;#34;&lt;br/&gt;    work=&amp;#34;$UPPER_BASE/$name-work&amp;#34;&lt;br/&gt;    lower=&amp;#34;$UPPER_BASE/$name-lower&amp;#34;&lt;br/&gt;&lt;br/&gt;    mkdir -p &amp;#34;$upper&amp;#34; &amp;#34;$work&amp;#34; &amp;#34;$lower&amp;#34;&lt;br/&gt;&lt;br/&gt;    mount --bind &amp;#34;$dir&amp;#34; &amp;#34;$lower&amp;#34;&lt;br/&gt;    mount --make-private &amp;#34;$lower&amp;#34;&lt;br/&gt;&lt;br/&gt;    mount -t overlay -o &amp;#34;lowerdir=$lower,upperdir=$upper,workdir=$work&amp;#34; overlay &amp;#34;$dir&amp;#34;&lt;br/&gt;&lt;br/&gt;    echo &amp;#34;Overlay active: $dir&amp;#34;&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;touch &amp;#34;$STATE_FILE&amp;#34;&lt;br/&gt;echo &amp;#34;Overlay mode ON (dm-crypt ephemeral)&amp;#34;
    </content>
    <updated>2026-07-13T09:55:14Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8p4t5y6hy2g3wm9hzr34rw9s9v9n92khqv8pgzw8t06cshuqcntgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032lm5me2</id>
    
      <title type="html">Установка pam-duress на Droidian, чтобы ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8p4t5y6hy2g3wm9hzr34rw9s9v9n92khqv8pgzw8t06cshuqcntgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032lm5me2" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrksh3vp66mczffkmrmp7f2zk9w4z4elnwwssj9w758v90cud364qpzamhxue69uhhyetvv9ujuurjd9kkzmpwdejhgtc54ugu0&#39;&gt;nevent1q…ugu0&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Установка pam-duress на Droidian, чтобы создавать ложные пинкоды / пароли, которые уничтожат все опасные файлы и приложения при разблокировке телефона&lt;br/&gt;&lt;br/&gt;sudo apt-get update&lt;br/&gt;sudo apt-get install -y build-essential libpam0g-dev libssl-dev&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;git clone &lt;a href=&#34;https://github.com/nuvious/pam-duress.git&#34;&gt;https://github.com/nuvious/pam-duress.git&lt;/a&gt;&lt;br/&gt;cd pam-duress&lt;br/&gt;make&lt;br/&gt;sudo make install&lt;br/&gt;make clean&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;mkdir -p ~/.duress   &lt;br/&gt;sudo mkdir -p /etc/duress.d&lt;br/&gt;&lt;br/&gt;# сюда пишем аварийные команды для удаления / изменения&lt;br/&gt;cat &amp;gt; ~/.duress/remove_test.sh &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;#!/bin/sh&lt;br/&gt;rm -rf /home/droidian/test&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;chmod 500 ~/.duress/remove_test.sh&lt;br/&gt;&lt;br/&gt;duress_sign ~/.duress/remove_test.sh&lt;br/&gt;&lt;br/&gt;chmod 400 ~/.duress/remove_test.sh.sha256&lt;br/&gt;&lt;br/&gt;# проверка&lt;br/&gt;ls -la ~/.duress/&lt;br/&gt;&lt;br/&gt;# меняем полностью /etc/pam.d/common-auth&lt;br/&gt;sudo nano /etc/pam.d/common-auth&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;# here are the per-package modules (the &amp;#34;Primary&amp;#34; block)&lt;br/&gt;auth	[success=2 default=ignore]	pam_unix.so nullok&lt;br/&gt;auth	[success=1 default=ignore]	pam_duress.so&lt;br/&gt;# here&amp;#39;s the fallback if no module succeeds&lt;br/&gt;auth	requisite			pam_deny.so&lt;br/&gt;# prime the stack with a positive return value if there isn&amp;#39;t one already;&lt;br/&gt;# this avoids us returning an error just because nothing sets a success code&lt;br/&gt;# since the modules above will each just jump around&lt;br/&gt;auth	required			pam_permit.so&lt;br/&gt;# and here are more per-package modules (the &amp;#34;Additional&amp;#34; block)&lt;br/&gt;auth	optional			pam_cap.so &lt;br/&gt;# end of pam-auth-update config&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;# проверка&lt;br/&gt;mkdir -p /home/droidian/test&lt;br/&gt;touch /home/user/test/test_file.txt
    </content>
    <updated>2026-07-09T16:36:42Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs0pjeum6pw256w4v2tsx0skj80tthzg0xw7m5c8euwml9nyf0g2vszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032eumsr5</id>
    
      <title type="html">допольнительные тулзы для помощи RAM ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs0pjeum6pw256w4v2tsx0skj80tthzg0xw7m5c8euwml9nyf0g2vszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032eumsr5" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsg20zq50vyjjju7yq57nqunaxdkwjepwj9djz4yyp9egcgsyq5jkspr9mhxue69uhhyetvv9ujumt0d4hhxarj9ecxjmnt9ug5duxy&#39;&gt;nevent1q…duxy&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;допольнительные тулзы для помощи RAM от перегрева.&lt;br/&gt;&lt;br/&gt;# OOM-менеджер: earlyoom&lt;br/&gt;sudo apt update&lt;br/&gt;sudo apt install earlyoom&lt;br/&gt;sudo systemctl enable --now earlyoom&lt;br/&gt;&lt;br/&gt;Настройка в /etc/default/earlyoom:&lt;br/&gt;EARLYOOM_ARGS=&amp;#34;-m 8,8 -s 15,15 --prefer &amp;#39;(Web Content|Isolated Web|brave-browser|brave|firefox|firefox-esr|chromium|chromium-browser|waydroid|waydroid-full-ui)&amp;#39; --avoid &amp;#39;(phosh|phoc|systemd|ofono|NetworkManager|pulseaudio|lxc@android|gnome-session|dbus)&amp;#39; -r 3600&amp;#34;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;# Скрипт периодического сброса кэша под давлением:&lt;br/&gt;&lt;br/&gt;sudo nano /usr/local/bin/droidian-memory-guard.sh&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;THRESHOLD=85&lt;br/&gt;COOLDOWN=600&lt;br/&gt;&lt;br/&gt;while true; do&lt;br/&gt;    MEM_USED=$(free | awk &amp;#39;/Mem:/ {printf &amp;#34;%.0f&amp;#34;, ($2-$7)/$2*100}&amp;#39;)&lt;br/&gt;    if [ &amp;#34;$MEM_USED&amp;#34; -gt &amp;#34;$THRESHOLD&amp;#34; ]; then&lt;br/&gt;        NOW=$(date &#43;%s)&lt;br/&gt;        LAST=$(cat /run/droidian-memguard.last 2&amp;gt;/dev/null || echo 0)&lt;br/&gt;        if [ $((NOW - LAST)) -gt &amp;#34;$COOLDOWN&amp;#34; ]; then&lt;br/&gt;            sync&lt;br/&gt;            echo 3 &amp;gt; /proc/sys/vm/drop_caches&lt;br/&gt;            echo &amp;#34;$NOW&amp;#34; &amp;gt; /run/droidian-memguard.last&lt;br/&gt;            logger -t droidian-memguard &amp;#34;Caches dropped at ${MEM_USED}%&amp;#34;&lt;br/&gt;        fi&lt;br/&gt;    fi&lt;br/&gt;    sleep 60&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;sudo chmod &#43;x /usr/local/bin/droidian-memory-guard.sh&lt;br/&gt;sudo nano /etc/systemd/system/droidian-memguard.service&lt;br/&gt;&lt;br/&gt;[Unit]&lt;br/&gt;Description=Droidian Memory Guard&lt;br/&gt;After=network.target&lt;br/&gt;&lt;br/&gt;[Service]&lt;br/&gt;Type=simple&lt;br/&gt;ExecStart=/usr/local/bin/droidian-memory-guard.sh&lt;br/&gt;Restart=always&lt;br/&gt;&lt;br/&gt;[Install]&lt;br/&gt;WantedBy=multi-user.target&lt;br/&gt;&lt;br/&gt;sudo systemctl enable --now droidian-memguard&lt;br/&gt;&lt;br/&gt;# Вырубим анимацию в Phosh&lt;br/&gt;&lt;br/&gt;gsettings set org.gnome.desktop.interface enable-animations false&lt;br/&gt;&lt;br/&gt;# Еще можно установить предел памяти для waydroid:&lt;br/&gt;&lt;br/&gt;sudo nano /var/lib/waydroid/lxc/waydroid/config&lt;br/&gt;&lt;br/&gt;lxc.cgroup.memory.limit_in_bytes = 900M&lt;br/&gt;&lt;br/&gt;# Eсли хотите увеличить размер zram0, то:&lt;br/&gt;&lt;br/&gt;sudo su&lt;br/&gt;swapoff /dev/zram0&lt;br/&gt;echo 1 &amp;gt; /sys/block/zram0/reset&lt;br/&gt;echo 2500M &amp;gt; /sys/block/zram0/disksize&lt;br/&gt;mkswap /dev/zram0&lt;br/&gt;swapon /dev/zram0 -p 50 # или ставьте 100, если надо, чтобы zram0 работал на пределе без помощи swapfile
    </content>
    <updated>2026-07-07T16:39:41Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsg7mtkl6nvv9mszkmdrqs66s5sx2jj9t3544fd9z4mxmcq07mg5rgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032zheg3f</id>
    
      <title type="html">Режим работы в памяти уже ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsg7mtkl6nvv9mszkmdrqs66s5sx2jj9t3544fd9z4mxmcq07mg5rgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032zheg3f" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrksh3vp66mczffkmrmp7f2zk9w4z4elnwwssj9w758v90cud364qppemhxue69uhkummn9ekx7mp0hf3zqf&#39;&gt;nevent1q…3zqf&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Режим работы в памяти уже отличается сильно от мобиан - не получится просто так засунуть скрипт в initramfs, чтобы система, как в tails, запускалась в памяти при запуске. Поэтому будем пользоваться этим режимом в уже запущенной системе, создав переключатель, в котором надо будет просто ввести команду sudo overlay on. в скрипте в TARGET_DIRS можно указать либо весь корень, либо отдельные папки. Корень лучше не указывать, иначе swapfile не будет работать и напряг памяти увеличится. создайте скрипт в /usr/local/bin/overlay:&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;# Toggle overlay mode for /etc and /var&lt;br/&gt;&lt;br/&gt;UPPER_BASE=&amp;#34;/mnt/overlay-persistent&amp;#34;  # Change to tmpfs path for ephemeral&lt;br/&gt;STATE_FILE=&amp;#34;/run/overlay-active&amp;#34;&lt;br/&gt;TARGET_DIRS=&amp;#34;/etc /var /home /root /usr /opt&amp;#34;&lt;br/&gt;&lt;br/&gt;toggle_on() {&lt;br/&gt;    [ -f &amp;#34;$STATE_FILE&amp;#34; ] &amp;amp;&amp;amp; { echo &amp;#34;Already active&amp;#34;; exit 1; }&lt;br/&gt;    &lt;br/&gt;    mkdir -p &amp;#34;$UPPER_BASE&amp;#34;&lt;br/&gt;    mount -t tmpfs -o size=50% tmpfs &amp;#34;$UPPER_BASE&amp;#34;&lt;br/&gt;    &lt;br/&gt;    for dir in $TARGET_DIRS; do&lt;br/&gt;        local name=$(echo &amp;#34;$dir&amp;#34; | tr &amp;#39;/&amp;#39; &amp;#39;-&amp;#39;)&lt;br/&gt;        local upper=&amp;#34;$UPPER_BASE/$name-upper&amp;#34;&lt;br/&gt;        local work=&amp;#34;$UPPER_BASE/$name-work&amp;#34;&lt;br/&gt;        local lower=&amp;#34;$UPPER_BASE/$name-lower&amp;#34;&lt;br/&gt;        &lt;br/&gt;        mkdir -p &amp;#34;$upper&amp;#34; &amp;#34;$work&amp;#34; &amp;#34;$lower&amp;#34;&lt;br/&gt;        &lt;br/&gt;        # Bind-mount original to preserve access&lt;br/&gt;        mount --bind &amp;#34;$dir&amp;#34; &amp;#34;$lower&amp;#34;&lt;br/&gt;        mount --make-private &amp;#34;$lower&amp;#34;&lt;br/&gt;        &lt;br/&gt;        # Mount overlay&lt;br/&gt;        mount -t overlay -o &amp;#34;lowerdir=$lower,upperdir=$upper,workdir=$work&amp;#34; overlay &amp;#34;$dir&amp;#34;&lt;br/&gt;        &lt;br/&gt;        echo &amp;#34;Overlay active: $dir&amp;#34;&lt;br/&gt;    done&lt;br/&gt;    &lt;br/&gt;    touch &amp;#34;$STATE_FILE&amp;#34;&lt;br/&gt;    echo &amp;#34;Overlay mode ON&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;toggle_off() {&lt;br/&gt;    [ ! -f &amp;#34;$STATE_FILE&amp;#34; ] &amp;amp;&amp;amp; { echo &amp;#34;Not active&amp;#34;; exit 1; }&lt;br/&gt;    &lt;br/&gt;    for dir in $TARGET_DIRS; do&lt;br/&gt;        umount &amp;#34;$dir&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    done&lt;br/&gt;    &lt;br/&gt;    # Clean up bind mounts&lt;br/&gt;    for mnt in $(mount | grep &amp;#34;$UPPER_BASE&amp;#34; | awk &amp;#39;{print $3}&amp;#39; | tac); do&lt;br/&gt;        umount &amp;#34;$mnt&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;    done&lt;br/&gt;    &lt;br/&gt;    rm -f &amp;#34;$STATE_FILE&amp;#34;&lt;br/&gt;    echo &amp;#34;Overlay mode OFF&amp;#34;&lt;br/&gt;    sync&lt;br/&gt;    reboot&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;show_status() {&lt;br/&gt;    if [ -f &amp;#34;$STATE_FILE&amp;#34; ]; then&lt;br/&gt;        echo &amp;#34;Overlay: ACTIVE&amp;#34;&lt;br/&gt;        echo &amp;#34;Upperdir location: $UPPER_BASE&amp;#34;&lt;br/&gt;        echo &amp;#34;Changes are stored on: $(df -T &amp;#34;$UPPER_BASE&amp;#34; | tail -1 | awk &amp;#39;{print $2}&amp;#39;)&amp;#34;&lt;br/&gt;    else&lt;br/&gt;        echo &amp;#34;Overlay: INACTIVE&amp;#34;&lt;br/&gt;    fi&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;case &amp;#34;$1&amp;#34; in&lt;br/&gt;    on) toggle_on ;;&lt;br/&gt;    off) toggle_off ;;&lt;br/&gt;    status) show_status ;;&lt;br/&gt;    *) echo &amp;#34;Usage: $0 {on|off|status}&amp;#34; ;;&lt;br/&gt;esac
    </content>
    <updated>2026-07-07T16:32:01Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsg20zq50vyjjju7yq57nqunaxdkwjepwj9djz4yyp9egcgsyq5jkszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630323znjdj</id>
    
      <title type="html">Дополнительный зашифрованный swap на ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsg20zq50vyjjju7yq57nqunaxdkwjepwj9djz4yyp9egcgsyq5jkszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630323znjdj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrksh3vp66mczffkmrmp7f2zk9w4z4elnwwssj9w758v90cud364qppemhxue69uhkummn9ekx7mp0hf3zqf&#39;&gt;nevent1q…3zqf&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Дополнительный зашифрованный swap на 4 гига - для старых телефонов свопов много не бывает. Работать будет вместо с zram0:&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;set -e&lt;br/&gt;&lt;br/&gt;SWAP_SIZE=&amp;#34;4G&amp;#34;  # Reduced for eMMC longevity&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Creating ${SWAP_SIZE} swap file...&amp;#34;&lt;br/&gt;&lt;br/&gt;# Use dd instead of fallocate for better compatibility with encrypted filesystems&lt;br/&gt;# fallocate may create holes that don&amp;#39;t work well with encryption&lt;br/&gt;dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress&lt;br/&gt;chmod 600 /swapfile&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Creating encrypted swap script...&amp;#34;&lt;br/&gt;&lt;br/&gt;cat &amp;gt; /usr/local/bin/encrypted-swap.sh &amp;lt;&amp;lt;&amp;#39;SCRIPT&amp;#39;&lt;br/&gt;#!/bin/bash&lt;br/&gt;set -e&lt;br/&gt;&lt;br/&gt;# Ждём, пока zram будет создан&lt;br/&gt;for i in {1..30}; do&lt;br/&gt;    if [ -b /dev/zram0 ]; then&lt;br/&gt;        break&lt;br/&gt;    fi&lt;br/&gt;    sleep 1&lt;br/&gt;done&lt;br/&gt;&lt;br/&gt;# Отключаем существующие swap&lt;br/&gt;swapoff /dev/zram0 2&amp;gt;/dev/null || true&lt;br/&gt;swapoff /dev/mapper/swapfile 2&amp;gt;/dev/null || true&lt;br/&gt;cryptsetup close swapfile 2&amp;gt;/dev/null || true&lt;br/&gt;losetup -D 2&amp;gt;/dev/null || true&lt;br/&gt;rm -f /run/encrypted-swap.loop&lt;br/&gt;&lt;br/&gt;# Настраиваем loop для swapfile&lt;br/&gt;LOOPDEV=$(losetup -f --show /swapfile)&lt;br/&gt;echo &amp;#34;$LOOPDEV&amp;#34; &amp;gt; /run/encrypted-swap.loop&lt;br/&gt;&lt;br/&gt;# Открываем с шифрованием&lt;br/&gt;cryptsetup open --type plain \&lt;br/&gt;    --key-file /dev/urandom \&lt;br/&gt;    --cipher aes-xts-plain64 \&lt;br/&gt;    --key-size 256 \&lt;br/&gt;    &amp;#34;$LOOPDEV&amp;#34; swapfile&lt;br/&gt;&lt;br/&gt;mkswap -f /dev/mapper/swapfile&lt;br/&gt;&lt;br/&gt;# Активируем ОБА swap с ОДИНАКОВЫМ приоритетом&lt;br/&gt;swapon -p 50 /dev/zram0&lt;br/&gt;swapon -p 50 /dev/mapper/swapfile&lt;br/&gt;SCRIPT&lt;br/&gt;&lt;br/&gt;chmod &#43;x /usr/local/bin/encrypted-swap.sh&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Creating systemd service...&amp;#34;&lt;br/&gt;&lt;br/&gt;cat &amp;gt; /etc/systemd/system/encrypted-swap.service &amp;lt;&amp;lt;&amp;#39;SERVICE&amp;#39;&lt;br/&gt;[Unit]&lt;br/&gt;Description=Encrypted Swap&lt;br/&gt;After=local-fs.target&lt;br/&gt;# Start after zram so we can set lower priority&lt;br/&gt;After=zramswap.service&lt;br/&gt;Wants=zramswap.service&lt;br/&gt;&lt;br/&gt;[Service]&lt;br/&gt;Type=oneshot&lt;br/&gt;RemainAfterExit=yes&lt;br/&gt;ExecStart=/usr/local/bin/encrypted-swap.sh&lt;br/&gt;ExecStop=/bin/bash -c &amp;#39;swapoff /dev/mapper/swapfile 2&amp;gt;/dev/null; cryptsetup close swapfile 2&amp;gt;/dev/null; LOOPDEV=$(cat /run/encrypted-swap.loop 2&amp;gt;/dev/null) &amp;amp;&amp;amp; losetup -d $LOOPDEV 2&amp;gt;/dev/null || true; rm -f /run/encrypted-swap.loop&amp;#39;&lt;br/&gt;&lt;br/&gt;[Install]&lt;br/&gt;WantedBy=multi-user.target&lt;br/&gt;SERVICE&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Cleaning up crypttab and fstab...&amp;#34;&lt;br/&gt;sed -i &amp;#39;/swap/d&amp;#39; /etc/crypttab 2&amp;gt;/dev/null || true&lt;br/&gt;sed -i &amp;#39;/swap/d&amp;#39; /etc/fstab 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Configuring swap preferences...&amp;#34;&lt;br/&gt;&lt;br/&gt;# Moderate swappiness - let kernel decide, but prefer zram&lt;br/&gt;cat &amp;gt; /etc/sysctl.d/99-swap.conf &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&lt;br/&gt;# Prefer zram over disk swap&lt;br/&gt;vm.swappiness=100&lt;br/&gt;vm.vfs_cache_pressure=200&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Enabling encrypted swap service...&amp;#34;&lt;br/&gt;systemctl daemon-reload&lt;br/&gt;systemctl enable encrypted-swap.service&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Activating encrypted swap...&amp;#34;&lt;br/&gt;/usr/local/bin/encrypted-swap.sh&lt;br/&gt;&lt;br/&gt;echo &amp;#34;&amp;#34;&lt;br/&gt;echo &amp;#34;[*] Verification:&amp;#34;&lt;br/&gt;swapon --show&lt;br/&gt;cryptsetup status swapfile 2&amp;gt;/dev/null || echo &amp;#34;cryptsetup status failed, checking lsblk:&amp;#34;&lt;br/&gt;lsblk | grep -i swap || true&lt;br/&gt;free -h | grep -i swap&lt;br/&gt;&lt;br/&gt;echo &amp;#34;&amp;#34;&lt;br/&gt;echo &amp;#34;[*] Encrypted swap setup complete.&amp;#34;&lt;br/&gt;echo &amp;#34;[*] New random key generated at each boot.&amp;#34;&lt;br/&gt;echo &amp;#34;[*] Swap data is unrecoverable after shutdown.&amp;#34;&lt;br/&gt;echo &amp;#34;[*] WARNING: Disk swap on eMMC wears storage. Consider larger zram instead.&amp;#34;
    </content>
    <updated>2026-07-07T16:26:44Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsq42n3hgallv2z5mrask3huhrc53yu7zc3ea945z38qpc3z3uavyszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630320lqf9d</id>
    
      <title type="html">Droidian сидит на андроид-ядре, поэтому ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsq42n3hgallv2z5mrask3huhrc53yu7zc3ea945z38qpc3z3uavyszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630320lqf9d" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrksh3vp66mczffkmrmp7f2zk9w4z4elnwwssj9w758v90cud364qppemhxue69uhkummn9ekx7mp0hf3zqf&#39;&gt;nevent1q…3zqf&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Droidian сидит на андроид-ядре, поэтому там, в отличие от мобиан, iptables. значит запуск всего трафика через тор будет по этому скрипту (у waydroid будет свой трафик и туда можно амнезию поставить):&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;# Flush ALL iptables rules completely (be careful if remote!)&lt;br/&gt;sudo iptables -F&lt;br/&gt;sudo iptables -X&lt;br/&gt;sudo iptables -t nat -F&lt;br/&gt;sudo iptables -t nat -X&lt;br/&gt;sudo iptables -t mangle -F&lt;br/&gt;sudo iptables -t mangle -X&lt;br/&gt;sudo iptables -P INPUT ACCEPT&lt;br/&gt;sudo iptables -P FORWARD ACCEPT&lt;br/&gt;sudo iptables -P OUTPUT ACCEPT&lt;br/&gt;&lt;br/&gt;# Verify clean state&lt;br/&gt;sudo iptables -L -v&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Installing Tor...&amp;#34;&lt;br/&gt;sudo apt update&lt;br/&gt;sudo apt install -y tor&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Configuring Tor...&amp;#34;&lt;br/&gt;&lt;br/&gt;# Backup original torrc&lt;br/&gt;sudo cp /etc/tor/torrc /etc/tor/torrc.backup&lt;br/&gt;&lt;br/&gt;# Configure Tor for transparent proxy&lt;br/&gt;sudo tee /etc/tor/torrc &amp;gt; /dev/null &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;SocksPort 127.0.0.1:9050&lt;br/&gt;TransPort 127.0.0.1:9040&lt;br/&gt;DNSPort 127.0.0.1:9053&lt;br/&gt;VirtualAddrNetworkIPv4 10.192.0.0/10&lt;br/&gt;AutomapHostsOnResolve 1&lt;br/&gt;RunAsDaemon 1&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Restarting Tor...&amp;#34;&lt;br/&gt;sudo systemctl restart tor&lt;br/&gt;sleep 2&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Checking Tor ports...&amp;#34;&lt;br/&gt;sudo ss -tlnp | grep -E &amp;#39;:(9050|9040|9053)&amp;#39;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Setting up iptables rules...&amp;#34;&lt;br/&gt;&lt;br/&gt;# IMPORTANT: First check if rules already exist to avoid duplicates&lt;br/&gt;# Flush existing rules in our custom chains (or create them)&lt;br/&gt;sudo iptables -t nat -F 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;# Create new chain for Tor (or flush if exists)&lt;br/&gt;sudo iptables -t nat -N TOR_REDIRECT 2&amp;gt;/dev/null || sudo iptables -t nat -F TOR_REDIRECT&lt;br/&gt;&lt;br/&gt;# Redirect DNS to Tor DNSPort&lt;br/&gt;sudo iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 9053&lt;br/&gt;&lt;br/&gt;# Redirect TCP traffic to Tor TransPort (except Tor itself)&lt;br/&gt;sudo iptables -t nat -A OUTPUT -p tcp --syn -m owner ! --uid-owner debian-tor -j REDIRECT --to-ports 9040&lt;br/&gt;&lt;br/&gt;# Allow loopback&lt;br/&gt;sudo iptables -t nat -A OUTPUT -o lo -j RETURN&lt;br/&gt;&lt;br/&gt;# Don&amp;#39;t redirect local/private networks (optional - adjust as needed)&lt;br/&gt;sudo iptables -t nat -A OUTPUT -d 127.0.0.0/8 -j RETURN&lt;br/&gt;sudo iptables -t nat -A OUTPUT -d 192.168.0.0/16 -j RETURN&lt;br/&gt;sudo iptables -t nat -A OUTPUT -d 10.0.0.0/8 -j RETURN&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Current iptables nat rules:&amp;#34;&lt;br/&gt;sudo iptables -t nat -L -v&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Tor transparent proxy is now active&amp;#34;&lt;br/&gt;echo &amp;#34;[*] Test with: curl --socks5 127.0.0.1:9050 &lt;a href=&#34;https://check.torproject.org&amp;#34&#34;&gt;https://check.torproject.org&amp;#34&lt;/a&gt;;&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Saving iptables rules...&amp;#34;&lt;br/&gt;sudo mkdir -p /etc/iptables&lt;br/&gt;sudo iptables-save &amp;gt; /etc/iptables/rules.v4&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Creating systemd service for autostart...&amp;#34;&lt;br/&gt;&lt;br/&gt;sudo tee /etc/systemd/system/tor-firewall.service &amp;gt; /dev/null &amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;&lt;br/&gt;[Unit]&lt;br/&gt;Description=Tor Transparent Proxy Firewall&lt;br/&gt;After=network.target tor.service&lt;br/&gt;Wants=tor.service&lt;br/&gt;&lt;br/&gt;[Service]&lt;br/&gt;Type=oneshot&lt;br/&gt;RemainAfterExit=yes&lt;br/&gt;ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4&lt;br/&gt;ExecStop=/sbin/iptables -F; /sbin/iptables -t nat -F; /sbin/iptables -t mangle -F&lt;br/&gt;&lt;br/&gt;[Install]&lt;br/&gt;WantedBy=multi-user.target&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo systemctl daemon-reload&lt;br/&gt;sudo systemctl enable tor-firewall.service&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Done. Rules will persist after reboot.&amp;#34;
    </content>
    <updated>2026-07-07T16:21:22Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsd30f44ckl7g9hyjed49lctmxc7vskn5u8j529xjp2n4trk32eakszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032mce4dr</id>
    
      <title type="html">если что-то пойдет не так, то на ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsd30f44ckl7g9hyjed49lctmxc7vskn5u8j529xjp2n4trk32eakszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032mce4dr" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqspy5zah0t73c5gxnldw25d69ywg6jj8x9qwpvw2hxtm9zjn3n34zqppemhxue69uhkummn9ekx7mp0sq8fk3&#39;&gt;nevent1q…8fk3&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;если что-то пойдет не так, то на телефонах пиксель проще всего вернуть обычный андроид и попробовать снова. просто заходишь на сайт android flash tools и подключаешь телефон к usb. главное - перед восстановлением нажать на редактирование и убрать галочку с &amp;#34;заблокировать загрузчик&amp;#34;. но там вряд ли что-то не так пойдет при установке - она слишком простая.
    </content>
    <updated>2026-07-07T15:57:58Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswyqz7yrdvshzygf8mnrxr926w62mpkx3vtz9sn9j3t5arzlxrwsgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032vt63yq</id>
    
      <title type="html">создаем команды для запуска и ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswyqz7yrdvshzygf8mnrxr926w62mpkx3vtz9sn9j3t5arzlxrwsgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032vt63yq" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsp6afxk224e995fhuvh7u8cp7d90kggkgxnsmw6hrdwqd0076ca8qpr9mhxue69uhhyetvv9ujumt0d4hhxarj9ecxjmnt9u9myxrz&#39;&gt;nevent1q…yxrz&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;создаем команды для запуска и деактивации overlayroot&lt;br/&gt;&lt;br/&gt;для выхода из overlayroot создайте в /usr/local/bin/stop-overlay:&lt;br/&gt;#!/bin/sh&lt;br/&gt;sudo mount -o remount,rw /live/image&lt;br/&gt;sudo touch /live/image/&lt;br/&gt;sudo mount -o remount,ro /live/image&lt;br/&gt;sudo reboot&lt;br/&gt;&lt;br/&gt;и затем в терминале sudo stop-overlay&lt;br/&gt;&lt;br/&gt;после перезагрузки всё пишется снова на диск. для запуска overlayroot создайте /usr/local/bin/start-overlay:&lt;br/&gt;rm /.overlayroot-disable&lt;br/&gt;sudo reboot&lt;br/&gt;&lt;br/&gt;и потом в терминале введи sudo start-overlay&lt;br/&gt;&lt;br/&gt;p.s. естеснна, все файлы в /usr/local/bin надо делать исполняемыми sudo chmod &#43;x
    </content>
    <updated>2026-07-05T09:41:38Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsp6afxk224e995fhuvh7u8cp7d90kggkgxnsmw6hrdwqd0076ca8qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303206my7n</id>
    
      <title type="html">затем устанавливаем свой вариант ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsp6afxk224e995fhuvh7u8cp7d90kggkgxnsmw6hrdwqd0076ca8qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303206my7n" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszfqcp3dssjkwypghsp6ugck98qudvyn57s3qwqka74dec3l3zqcqpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhs6ht02z&#39;&gt;nevent1q…t02z&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;затем устанавливаем свой вариант overlayroot в initramfs для работы в RAM и потере данных при перезагрузке из режима overlayroot:&lt;br/&gt;&lt;br/&gt;sudo tee /etc/initramfs-tools/scripts/init-bottom/overlayroot &amp;gt;/dev/null &amp;lt;&amp;lt;EOF&lt;br/&gt;#!/bin/sh&lt;br/&gt;# Overlayroot initramfs hook для Debian/Mobian&lt;br/&gt;&lt;br/&gt;case &amp;#34;$1&amp;#34; in&lt;br/&gt;    prereqs)&lt;br/&gt;        echo &amp;#34;&amp;#34;&lt;br/&gt;        exit 0&lt;br/&gt;        ;;&lt;br/&gt;esac&lt;br/&gt;&lt;br/&gt;. /scripts/functions&lt;br/&gt;&lt;br/&gt;PATH=/usr/sbin:/usr/bin:/sbin:/bin&lt;br/&gt;MYTAG=&amp;#34;overlayroot&amp;#34;&lt;br/&gt;&lt;br/&gt;# === НАСТРОЙКИ ===&lt;br/&gt;root_rw=/media/root-rw&lt;br/&gt;root_ro=/media/root-ro&lt;br/&gt;NEWROOT=&amp;#34;${rootmnt:-/root}&amp;#34;&lt;br/&gt;OVERLAYROOT_DEBUG=1&lt;br/&gt;&lt;br/&gt;# === ЛОГИРОВАНИЕ ===&lt;br/&gt;log() {&lt;br/&gt;    &amp;#34;log_${1}_msg&amp;#34; &amp;#34;$MYTAG: $2&amp;#34;&lt;br/&gt;    _debug &amp;#34;[$1]:&amp;#34; &amp;#34;$2&amp;#34;&lt;br/&gt;}&lt;br/&gt;log_fail() { log failure &amp;#34;$*&amp;#34;; }&lt;br/&gt;log_success() { log success &amp;#34;$*&amp;#34;; }&lt;br/&gt;log_warn() { log warning &amp;#34;$*&amp;#34;; }&lt;br/&gt;fail() {&lt;br/&gt;    [ $# -eq 0 ] || log_fail &amp;#34;$@&amp;#34;&lt;br/&gt;    exit 0&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;_debug() {&lt;br/&gt;    if [ &amp;#34;${DEBUG_BUSTED:-0}&amp;#34; = &amp;#34;0&amp;#34; ]; then&lt;br/&gt;        { echo &amp;#34;$@&amp;#34; &amp;gt;&amp;gt; &amp;#34;/dev/.initramfs/${MYTAG}.log&amp;#34;; } 2&amp;gt;/dev/null ||&lt;br/&gt;        { DEBUG_BUSTED=1; logwarn &amp;#34;debug is busted&amp;#34;; }&lt;br/&gt;    fi&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;debug() {&lt;br/&gt;    _debug &amp;#34;$@&amp;#34;&lt;br/&gt;    [ &amp;#34;${OVERLAYROOT_DEBUG:-0}&amp;#34; = &amp;#34;0&amp;#34; ] &amp;amp;&amp;amp; return&lt;br/&gt;    echo &amp;#34;$MYTAG:&amp;#34; &amp;#34;$@&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;# === ПАРСИНГ КОМАНДНОЙ СТРОКИ ЯДРА ===&lt;br/&gt;# Читаем /proc/cmdline и ищем параметры overlayroot*&lt;br/&gt;parse_cmdline() {&lt;br/&gt;    local cmdline=&amp;#34;&amp;#34;&lt;br/&gt;    read cmdline &amp;lt; /proc/cmdline || return 1&lt;br/&gt;&lt;br/&gt;    OVERLAY_MODE=&amp;#34;&amp;#34;&lt;br/&gt;    OVERLAY_CHROOT=0&lt;br/&gt;&lt;br/&gt;    for tok in $cmdline; do&lt;br/&gt;        case &amp;#34;$tok&amp;#34; in&lt;br/&gt;            overlayroot=off)&lt;br/&gt;                OVERLAY_MODE=&amp;#34;disabled&amp;#34;&lt;br/&gt;                ;;&lt;br/&gt;            overlayroot=chroot)&lt;br/&gt;                OVERLAY_CHROOT=1&lt;br/&gt;                ;;&lt;br/&gt;            overlayroot=tmpfs)&lt;br/&gt;                OVERLAY_MODE=&amp;#34;tmpfs&amp;#34;&lt;br/&gt;                ;;&lt;br/&gt;            overlayroot=*)&lt;br/&gt;                OVERLAY_MODE=&amp;#34;${tok#overlayroot=}&amp;#34;&lt;br/&gt;                ;;&lt;br/&gt;        esac&lt;br/&gt;    done&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;# === ПРОВЕРКА ФЛАГОВ В ОРИГИНАЛЬНОМ КОРНЕ ===&lt;br/&gt;check_disable_flags() {&lt;br/&gt;    # Проверяем флаг-файл в оригинальном корне (до overlay)&lt;br/&gt;    if [ -f &amp;#34;$NEWROOT/.overlayroot-disable&amp;#34; ]; then&lt;br/&gt;        log_success &amp;#34;found .overlayroot-disable flag, disabling overlay&amp;#34;&lt;br/&gt;        rm -f &amp;#34;$NEWROOT/.overlayroot-disable&amp;#34;&lt;br/&gt;        return 0&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    # Проверяем флаг-файл для одноразового chroot&lt;br/&gt;    if [ -f &amp;#34;$NEWROOT/.overlayroot-chroot&amp;#34; ]; then&lt;br/&gt;        log_success &amp;#34;found .overlayroot-chroot flag, enabling chroot mode&amp;#34;&lt;br/&gt;        OVERLAY_CHROOT=1&lt;br/&gt;        rm -f &amp;#34;$NEWROOT/.overlayroot-chroot&amp;#34;&lt;br/&gt;        return 1&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    return 1&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;# === МОНТИРОВАНИЕ TMPFS ДЛЯ OVERLAY ===&lt;br/&gt;mount_overlay_tmpfs() {&lt;br/&gt;    local size=&amp;#34;${1:-50%}&amp;#34;&lt;br/&gt;&lt;br/&gt;    mkdir -p &amp;#34;$root_rw&amp;#34; || fail &amp;#34;failed to create $root_rw&amp;#34;&lt;br/&gt;    mount -t tmpfs -o mode=0755,size=80% tmpfs-root &amp;#34;$root_rw&amp;#34; ||&lt;br/&gt;        fail &amp;#34;failed to mount tmpfs on $root_rw&amp;#34;&lt;br/&gt;&lt;br/&gt;    mkdir -p &amp;#34;$root_rw/overlay&amp;#34; &amp;#34;$root_rw/work&amp;#34; ||&lt;br/&gt;        fail &amp;#34;failed to create overlay dirs on tmpfs&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;# === МОНТИРОВАНИЕ ОРИГИНАЛЬНОГО КОРНЯ ===&lt;br/&gt;mount_original_root() {&lt;br/&gt;    mkdir -p &amp;#34;$root_ro&amp;#34; || fail &amp;#34;failed to create $root_ro&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Если корень уже примонтирован в NEWROOT — биндим его&lt;br/&gt;    if [ -d &amp;#34;$NEWROOT/bin&amp;#34; ]; then&lt;br/&gt;        mount --bind &amp;#34;$NEWROOT&amp;#34; &amp;#34;$root_ro&amp;#34; ||&lt;br/&gt;            fail &amp;#34;failed to bind $NEWROOT to $root_ro&amp;#34;&lt;br/&gt;    else&lt;br/&gt;        fail &amp;#34;$NEWROOT is not mounted&amp;#34;&lt;br/&gt;    fi&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;# === МОНТИРОВАНИЕ OVERLAY ===&lt;br/&gt;mount_overlay() {&lt;br/&gt;    local lowerdir=&amp;#34;$1&amp;#34;&lt;br/&gt;    local upperdir=&amp;#34;$2&amp;#34;&lt;br/&gt;    local workdir=&amp;#34;$3&amp;#34;&lt;br/&gt;    local target=&amp;#34;$4&amp;#34;&lt;br/&gt;&lt;br/&gt;    mkdir -p &amp;#34;$target&amp;#34; || fail &amp;#34;failed to create $target&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Проверяем версию ядра для workdir&lt;br/&gt;    local mount_opts=&amp;#34;lowerdir=$lowerdir,upperdir=$upperdir&amp;#34;&lt;br/&gt;    case &amp;#34;$(uname -r)&amp;#34; in&lt;br/&gt;        2*|3.1[01234567]*|3.[0-9].*)&lt;br/&gt;            # Старые ядра не требуют workdir&lt;br/&gt;            ;;&lt;br/&gt;        *)&lt;br/&gt;            mount_opts=&amp;#34;$mount_opts,workdir=$workdir&amp;#34;&lt;br/&gt;            ;;&lt;br/&gt;    esac&lt;br/&gt;&lt;br/&gt;    mount -t overlay -o &amp;#34;$mount_opts&amp;#34; overlayroot &amp;#34;$target&amp;#34; ||&lt;br/&gt;        fail &amp;#34;failed to mount overlay on $target&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;# === ПЕРЕМЕЩЕНИЕ MOUNTPOINT&amp;#39;ОВ ===&lt;br/&gt;move_mounts() {&lt;br/&gt;    local source=&amp;#34;$1&amp;#34;&lt;br/&gt;    local dest=&amp;#34;$2&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Переносим все дочерние mountpoint&amp;#39;ы (кроме самого source)&lt;br/&gt;    local mounts=&amp;#34;&amp;#34;&lt;br/&gt;    mounts=$(awk -v mnt=&amp;#34;$source&amp;#34; &amp;#39;$2 ~ &amp;#34;^&amp;#34;mnt &amp;amp;&amp;amp; $2 != mnt {print $2}&amp;#39; /proc/mounts | sort)&lt;br/&gt;&lt;br/&gt;    for mp in $mounts; do&lt;br/&gt;        local rel=&amp;#34;${mp#$source}&amp;#34;&lt;br/&gt;        [ -z &amp;#34;$rel&amp;#34; ] &amp;amp;&amp;amp; continue&lt;br/&gt;&lt;br/&gt;        mkdir -p &amp;#34;$dest$rel&amp;#34; || log_warn &amp;#34;failed to create $dest$rel&amp;#34;&lt;br/&gt;        mount --move &amp;#34;$mp&amp;#34; &amp;#34;$dest$rel&amp;#34; ||&lt;br/&gt;            log_warn &amp;#34;failed to move $mp to $dest$rel&amp;#34;&lt;br/&gt;    done&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;# === ОБНОВЛЕНИЕ FSTAB ===&lt;br/&gt;update_fstab() {&lt;br/&gt;    local root_ro=&amp;#34;$1&amp;#34;&lt;br/&gt;    local root_rw=&amp;#34;$2&amp;#34;&lt;br/&gt;&lt;br/&gt;    [ -f &amp;#34;${NEWROOT}/etc/fstab&amp;#34; ] || return 0&lt;br/&gt;&lt;br/&gt;    # Сохраняем оригинальный fstab&lt;br/&gt;    cp &amp;#34;${NEWROOT}/etc/fstab&amp;#34; &amp;#34;${NEWROOT}/etc/fstab.orig&amp;#34; 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;    cat &amp;lt;&amp;lt;EOF &amp;gt;&amp;#34;${NEWROOT}/etc/fstab&amp;#34;&lt;br/&gt;# This fstab is in an overlayfs.&lt;br/&gt;# The real one can be found at ${root_ro}/etc/fstab&lt;br/&gt;# To permanently modify files, chroot into writable view:&lt;br/&gt;# sudo mount -o remount,rw ${root_ro}&lt;br/&gt;# sudo chroot ${root_ro}&lt;br/&gt;#&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;    # Копируем оригинальные записи с изменёнными путями&lt;br/&gt;    while read spec file vfstype opts pass freq; do&lt;br/&gt;        # Пропускаем комментарии и пустые строки&lt;br/&gt;        case &amp;#34;$spec&amp;#34; in&lt;br/&gt;            \#*|&amp;#34;&amp;#34;|swap) continue ;;&lt;br/&gt;        esac&lt;br/&gt;&lt;br/&gt;        # Корневую ФС заменяем на overlay&lt;br/&gt;        if [ &amp;#34;$file&amp;#34; = &amp;#34;/&amp;#34; ]; then&lt;br/&gt;            echo &amp;#34;overlayroot / overlay defaults 0 0&amp;#34;&lt;br/&gt;            echo &amp;#34;${root_ro} ${root_ro} none bind,ro 0 0&amp;#34;&lt;br/&gt;            echo &amp;#34;${root_rw} ${root_rw} none bind,rw 0 0&amp;#34;&lt;br/&gt;            continue&lt;br/&gt;        fi&lt;br/&gt;&lt;br/&gt;        # Виртуальные ФС пропускаем&lt;br/&gt;        case &amp;#34;$vfstype&amp;#34; in&lt;br/&gt;            proc|sys|tmpfs|devtmpfs|devpts|overlay) continue ;;&lt;br/&gt;        esac&lt;br/&gt;&lt;br/&gt;        # Остальные монтируем в ro-слой&lt;br/&gt;        echo &amp;#34;$spec ${root_ro}${file} $vfstype ro,$opts $pass $freq&amp;#34;&lt;br/&gt;    done &amp;lt; &amp;#34;${NEWROOT}/etc/fstab.orig&amp;#34; &amp;gt;&amp;gt; &amp;#34;${NEWROOT}/etc/fstab&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;# === СОЗДАНИЕ ТОЧЕК ДОСТУПА /live/* ===&lt;br/&gt;create_live_access() {&lt;br/&gt;    local root_ro=&amp;#34;$1&amp;#34;&lt;br/&gt;    local root_rw=&amp;#34;$2&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Создаём /live/image (доступ к оригинальному ro корню)&lt;br/&gt;    mkdir -p &amp;#34;${NEWROOT}/live/image&amp;#34; || log_warn &amp;#34;failed to create /live/image&amp;#34;&lt;br/&gt;    mount --bind &amp;#34;$root_ro&amp;#34; &amp;#34;${NEWROOT}/live/image&amp;#34; ||&lt;br/&gt;        log_warn &amp;#34;failed to bind $root_ro to /live/image&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Создаём /live/cow (доступ к rw слою)&lt;br/&gt;    mkdir -p &amp;#34;${NEWROOT}/live/cow&amp;#34; || log_warn &amp;#34;failed to create /live/cow&amp;#34;&lt;br/&gt;    mount --bind &amp;#34;$root_rw&amp;#34; &amp;#34;${NEWROOT}/live/cow&amp;#34; ||&lt;br/&gt;        log_warn &amp;#34;failed to bind $root_rw to /live/cow&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;# === ОСНОВНАЯ ЛОГИКА ===&lt;br/&gt;&lt;br/&gt;# 1. Парсим командную строку ядра&lt;br/&gt;parse_cmdline&lt;br/&gt;&lt;br/&gt;# 2. Проверяем флаги отключения&lt;br/&gt;check_disable_flags&lt;br/&gt;if [ $? -eq 0 ]; then&lt;br/&gt;    OVERLAY_MODE=&amp;#34;disabled&amp;#34;&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# 3. Если overlay отключён — выходим&lt;br/&gt;case &amp;#34;${OVERLAY_MODE:-enabled}&amp;#34; in&lt;br/&gt;    disabled|off|no)&lt;br/&gt;        log_success &amp;#34;overlayroot disabled, booting normal root&amp;#34;&lt;br/&gt;        exit 0&lt;br/&gt;        ;;&lt;br/&gt;esac&lt;br/&gt;&lt;br/&gt;# 4. Проверяем что корень смонтирован&lt;br/&gt;if [ ! -d &amp;#34;$NEWROOT/bin&amp;#34; ]; then&lt;br/&gt;    log_fail &amp;#34;$NEWROOT is not mounted&amp;#34;&lt;br/&gt;    exit 0&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# 5. Создаём временные директории в RAM&lt;br/&gt;mkdir -p /run/overlay&lt;br/&gt;mount -t tmpfs -o mode=0755,size=100% tmpfs /run/overlay ||&lt;br/&gt;    fail &amp;#34;failed to mount tmpfs on /run/overlay&amp;#34;&lt;br/&gt;&lt;br/&gt;# 6. Монтируем оригинальный корень в ro-слой&lt;br/&gt;mount_original_root&lt;br/&gt;&lt;br/&gt;# 7. Монтируем tmpfs для rw-слоя&lt;br/&gt;mount_overlay_tmpfs&lt;br/&gt;&lt;br/&gt;# 8. Если запрошен chroot-режим — монтируем overlay отдельно&lt;br/&gt;if [ &amp;#34;$OVERLAY_CHROOT&amp;#34; = &amp;#34;1&amp;#34; ]; then&lt;br/&gt;    log_warn &amp;#34;chroot mode requested, overlay will be available at /overlay&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Монтируем overlay в /overlay внутри нового корня&lt;br/&gt;    mkdir -p &amp;#34;${NEWROOT}/overlay&amp;#34;&lt;br/&gt;    mount_overlay &amp;#34;$root_ro&amp;#34; &amp;#34;$root_rw/overlay&amp;#34; &amp;#34;$root_rw/work&amp;#34; &amp;#34;${NEWROOT}/overlay&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Создаём точки доступа&lt;br/&gt;    create_live_access &amp;#34;$root_ro&amp;#34; &amp;#34;$root_rw&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Переносим дочерние mountpoint&amp;#39;ы&lt;br/&gt;    move_mounts &amp;#34;$NEWROOT&amp;#34; &amp;#34;${NEWROOT}/overlay&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Обновляем fstab&lt;br/&gt;    update_fstab &amp;#34;$root_ro&amp;#34; &amp;#34;$root_rw&amp;#34;&lt;br/&gt;&lt;br/&gt;    log_success &amp;#34;chroot overlay configured at /overlay&amp;#34;&lt;br/&gt;    exit 0&lt;br/&gt;fi&lt;br/&gt;&lt;br/&gt;# 9. Обычный режим: перемещаем корень в ro-слой, монтируем overlay на его место&lt;br/&gt;# Перемещаем оригинальный корень&lt;br/&gt;mount --move &amp;#34;$NEWROOT&amp;#34; &amp;#34;$root_ro&amp;#34; ||&lt;br/&gt;    fail &amp;#34;failed to move $NEWROOT to $root_ro&amp;#34;&lt;br/&gt;&lt;br/&gt;# Монтируем overlay на место оригинального корня&lt;br/&gt;mount_overlay &amp;#34;$root_ro&amp;#34; &amp;#34;$root_rw/overlay&amp;#34; &amp;#34;$root_rw/work&amp;#34; &amp;#34;$NEWROOT&amp;#34;&lt;br/&gt;&lt;br/&gt;# 10. Переносим mountpoint&amp;#39;ы внутрь overlay&lt;br/&gt;move_mounts &amp;#34;$root_ro&amp;#34; &amp;#34;$NEWROOT&amp;#34;&lt;br/&gt;&lt;br/&gt;# 11. Перемещаем ro и rw слои внутрь overlay (чтобы были доступны из системы)&lt;br/&gt;mkdir -p &amp;#34;${NEWROOT}${root_ro}&amp;#34; &amp;#34;${NEWROOT}${root_rw}&amp;#34;&lt;br/&gt;mount --move &amp;#34;$root_ro&amp;#34; &amp;#34;${NEWROOT}${root_ro}&amp;#34; ||&lt;br/&gt;    log_warn &amp;#34;failed to move $root_ro into overlay&amp;#34;&lt;br/&gt;mount --move &amp;#34;$root_rw&amp;#34; &amp;#34;${NEWROOT}${root_rw}&amp;#34; ||&lt;br/&gt;    log_warn &amp;#34;failed to move $root_rw into overlay&amp;#34;&lt;br/&gt;&lt;br/&gt;# 12. Создаём точки доступа /live/*&lt;br/&gt;create_live_access &amp;#34;${NEWROOT}${root_ro}&amp;#34; &amp;#34;${NEWROOT}${root_rw}&amp;#34;&lt;br/&gt;&lt;br/&gt;# 13. Обновляем fstab&lt;br/&gt;update_fstab &amp;#34;$root_ro&amp;#34; &amp;#34;$root_rw&amp;#34;&lt;br/&gt;&lt;br/&gt;# 14. Если ядро просило ro — перемонтируем&lt;br/&gt;read cmdline &amp;lt; /proc/cmdline&lt;br/&gt;case &amp;#34; $cmdline &amp;#34; in&lt;br/&gt;    *\ ro\ *)&lt;br/&gt;        mount -o remount,ro &amp;#34;$NEWROOT&amp;#34; ||&lt;br/&gt;            log_warn &amp;#34;failed to remount overlay read-only&amp;#34;&lt;br/&gt;        ;;&lt;br/&gt;esac&lt;br/&gt;&lt;br/&gt;log_success &amp;#34;overlayroot configured with /live/image and /live/cow access&amp;#34;&lt;br/&gt;exit 0&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;sudo chmod 755 /etc/initramfs-tools/scripts/init-bottom/overlayroot&lt;br/&gt;&lt;br/&gt;echo &amp;#34;overlay&amp;#34; | sudo tee -a /etc/initramfs-tools/modules&lt;br/&gt;&lt;br/&gt;sudo update-initramfs -u -k all&lt;br/&gt;&lt;br/&gt;sudo dpkg-reconfigure linux-image-$(uname -r)
    </content>
    <updated>2026-07-05T09:31:25Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvz5z5qj0wshe2rcx3gtrsa3yfnc67squmuglmyg07dkvqmkm9fcszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032u23vs9</id>
    
      <title type="html">Если хотите иметь еще и VPN, например ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvz5z5qj0wshe2rcx3gtrsa3yfnc67squmuglmyg07dkvqmkm9fcszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032u23vs9" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsvwxpfnrmyqa5uar5wxv8clgm7u5s58urp5h04j0pjfm6mtq3y58gpzemhxue69uhkummnw3ezuerpw3sju6rpw4ej7pcpzhc&#39;&gt;nevent1q…pzhc&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Если хотите иметь еще и VPN, например WG, то запустите его по классике и сделайте такой переключатель из тора в вг и обратно в /usr/local/bin (переключение будет через команды sudo toggle-net wg или sudo toggle-net tor):&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;# Toggle between Tor transparent proxy and WireGuard VPN&lt;br/&gt;# Usage: sudo ./toggle-tor-wireguard.sh [tor|wg|status]&lt;br/&gt;&lt;br/&gt;set -e&lt;br/&gt;&lt;br/&gt;MODE=&amp;#34;${1:-status}&amp;#34;&lt;br/&gt;NFT_CONF_TOR=&amp;#34;/etc/nftables.conf&amp;#34;&lt;br/&gt;NFT_CONF_WG=&amp;#34;/etc/nftables.wg.conf&amp;#34;&lt;br/&gt;WIREGUARD_CONF=&amp;#34;/etc/wireguard/wg0.conf&amp;#34;&lt;br/&gt;&lt;br/&gt;show_status() {&lt;br/&gt;    echo &amp;#34;=== Current Status ===&amp;#34;&lt;br/&gt;    echo &amp;#34;&amp;#34;&lt;br/&gt;    echo &amp;#34;--- nftables rules ---&amp;#34;&lt;br/&gt;    sudo nft list ruleset 2&amp;gt;/dev/null || echo &amp;#34;No nftables rules loaded&amp;#34;&lt;br/&gt;    echo &amp;#34;&amp;#34;&lt;br/&gt;    echo &amp;#34;--- Tor service ---&amp;#34;&lt;br/&gt;    systemctl is-active tor 2&amp;gt;/dev/null || echo &amp;#34;Tor: inactive&amp;#34;&lt;br/&gt;    echo &amp;#34;&amp;#34;&lt;br/&gt;    echo &amp;#34;--- WireGuard ---&amp;#34;&lt;br/&gt;    wg show 2&amp;gt;/dev/null || echo &amp;#34;WireGuard: no interfaces&amp;#34;&lt;br/&gt;    echo &amp;#34;&amp;#34;&lt;br/&gt;    echo &amp;#34;--- Default route ---&amp;#34;&lt;br/&gt;    ip route | grep default || true&lt;br/&gt;    echo &amp;#34;&amp;#34;&lt;br/&gt;    echo &amp;#34;--- Checking Tor connectivity ---&amp;#34;&lt;br/&gt;    curl -s &lt;a href=&#34;https://check.torproject.org&#34;&gt;https://check.torproject.org&lt;/a&gt; | grep -i &amp;#34;congratulations\|sorry&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;disable_tor() {&lt;br/&gt;    echo &amp;#34;[*] Disabling Tor transparent proxy...&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Stop Tor service&lt;br/&gt;    if systemctl is-active --quiet tor 2&amp;gt;/dev/null; then&lt;br/&gt;        sudo systemctl stop tor&lt;br/&gt;        echo &amp;#34;    Tor service stopped&amp;#34;&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    # Flush nftables (remove Tor rules)&lt;br/&gt;    sudo nft flush ruleset 2&amp;gt;/dev/null || true&lt;br/&gt;    echo &amp;#34;    nftables flushed&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Restore basic nftables or leave empty for WireGuard&lt;br/&gt;    sudo nft -f - &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; 2&amp;gt;/dev/null || true&lt;br/&gt;#!/usr/sbin/nft -f&lt;br/&gt;&lt;br/&gt;table ip filter {&lt;br/&gt;    chain input {&lt;br/&gt;        type filter hook input priority filter; policy accept;&lt;br/&gt;    }&lt;br/&gt;    chain forward {&lt;br/&gt;        type filter hook forward priority filter; policy accept;&lt;br/&gt;    }&lt;br/&gt;    chain output {&lt;br/&gt;        type filter hook output priority filter; policy accept;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;    echo &amp;#34;[*] Tor disabled. Basic firewall restored.&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;enable_wireguard() {&lt;br/&gt;    echo &amp;#34;[*] Enabling WireGuard...&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Check if WireGuard config exists&lt;br/&gt;    if [ ! -f &amp;#34;$WIREGUARD_CONF&amp;#34; ]; then&lt;br/&gt;        echo &amp;#34;[!] WireGuard config not found: $WIREGUARD_CONF&amp;#34;&lt;br/&gt;        echo &amp;#34;    Please create your WireGuard configuration first.&amp;#34;&lt;br/&gt;        exit 1&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    # Make sure Tor is stopped&lt;br/&gt;    disable_tor&lt;br/&gt;&lt;br/&gt;    # Enable IP forwarding (required for WireGuard)&lt;br/&gt;    sudo sysctl -w net.ipv4.ip_forward=1 &amp;gt;/dev/null&lt;br/&gt;&lt;br/&gt;    # Start WireGuard&lt;br/&gt;    sudo wg-quick up wg0 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;    # Ensure WireGuard starts on boot&lt;br/&gt;    sudo systemctl enable wg-quick@wg0 2&amp;gt;/dev/null || true&lt;br/&gt;    sudo systemctl start wg-quick@wg0 2&amp;gt;/dev/null || true&lt;br/&gt;&lt;br/&gt;    echo &amp;#34;[*] WireGuard enabled on wg0&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;enable_tor() {&lt;br/&gt;    echo &amp;#34;[*] Enabling Tor transparent proxy...&amp;#34;&lt;br/&gt;&lt;br/&gt;    # Stop WireGuard if active&lt;br/&gt;    if wg show wg0 &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br/&gt;        echo &amp;#34;    Stopping WireGuard...&amp;#34;&lt;br/&gt;        sudo wg-quick down wg0 2&amp;gt;/dev/null || true&lt;br/&gt;        sudo systemctl stop wg-quick@wg0 2&amp;gt;/dev/null || true&lt;br/&gt;        sudo systemctl disable wg-quick@wg0 2&amp;gt;/dev/null || true&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    # Restore Tor nftables rules&lt;br/&gt;    if [ -f &amp;#34;$NFT_CONF_TOR&amp;#34; ]; then&lt;br/&gt;        sudo nft -f &amp;#34;$NFT_CONF_TOR&amp;#34;&lt;br/&gt;        echo &amp;#34;    Tor nftables rules restored&amp;#34;&lt;br/&gt;    else&lt;br/&gt;        echo &amp;#34;[!] Tor nftables config not found: $NFT_CONF_TOR&amp;#34;&lt;br/&gt;        exit 1&lt;br/&gt;    fi&lt;br/&gt;&lt;br/&gt;    # Start Tor&lt;br/&gt;    sudo systemctl start tor&lt;br/&gt;    sudo systemctl enable tor&lt;br/&gt;&lt;br/&gt;    echo &amp;#34;[*] Tor transparent proxy enabled&amp;#34;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;case &amp;#34;$MODE&amp;#34; in&lt;br/&gt;    tor|t)&lt;br/&gt;        enable_tor&lt;br/&gt;        ;;&lt;br/&gt;    wg|wireguard|w)&lt;br/&gt;        enable_wireguard&lt;br/&gt;        ;;&lt;br/&gt;    status|s|&amp;#34;&amp;#34;)&lt;br/&gt;        show_status&lt;br/&gt;        ;;&lt;br/&gt;    *)&lt;br/&gt;        echo &amp;#34;Usage: $0 [tor|wg|status]&amp;#34;&lt;br/&gt;        echo &amp;#34;&amp;#34;&lt;br/&gt;        echo &amp;#34;  tor     - Enable Tor transparent proxy, disable WireGuard&amp;#34;&lt;br/&gt;        echo &amp;#34;  wg      - Enable WireGuard VPN, disable Tor&amp;#34;&lt;br/&gt;        echo &amp;#34;  status  - Show current network status (default)&amp;#34;&lt;br/&gt;        echo &amp;#34;&amp;#34;&lt;br/&gt;        exit 1&lt;br/&gt;        ;;&lt;br/&gt;esac&lt;br/&gt;&lt;br/&gt;echo &amp;#34;&amp;#34;&lt;br/&gt;show_status
    </content>
    <updated>2026-07-05T09:27:56Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvwxpfnrmyqa5uar5wxv8clgm7u5s58urp5h04j0pjfm6mtq3y58gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630322hz0fk</id>
    
      <title type="html">После запуска системы запускаем ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvwxpfnrmyqa5uar5wxv8clgm7u5s58urp5h04j0pjfm6mtq3y58gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630322hz0fk" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqszfqcp3dssjkwypghsp6ugck98qudvyn57s3qwqka74dec3l3zqcqpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhs6ht02z&#39;&gt;nevent1q…t02z&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;После запуска системы запускаем обновления. Затем отправляем весь трафик через Tor, запустив этот скрипт (оставляем только дырку для Waydroid, в который для торификации установите Invizible Pro и в настройках VPN включите блокировку трафика при отключении приложения):&lt;br/&gt;&lt;br/&gt;#!/bin/bash&lt;br/&gt;&lt;br/&gt;set -e&lt;br/&gt;&lt;br/&gt;TOR_UID=108&lt;br/&gt;&lt;br/&gt;# Step 1: Install Tor&lt;br/&gt;echo &amp;#34;[*] Installing Tor...&amp;#34;&lt;br/&gt;sudo apt update&lt;br/&gt;sudo apt install -y tor&lt;br/&gt;&lt;br/&gt;# Step 2: Configure Tor&lt;br/&gt;echo &amp;#34;[*] Configuring Tor...&amp;#34;&lt;br/&gt;sudo tee /etc/tor/torrc &amp;gt;/dev/null &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&lt;br/&gt;TransPort 127.0.0.1:9040&lt;br/&gt;DNSPort 127.0.0.1:9053&lt;br/&gt;AutomapHostsOnResolve 1&lt;br/&gt;VirtualAddrNetworkIPv4 10.192.0.0/10&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;# Step 3: Restart and enable Tor&lt;br/&gt;echo &amp;#34;[*] Restarting and enabling Tor service...&amp;#34;&lt;br/&gt;sudo systemctl restart tor&lt;br/&gt;sudo systemctl enable tor&lt;br/&gt;&lt;br/&gt;# Step 4: Verify Tor is listening&lt;br/&gt;echo &amp;#34;[*] Checking Tor listening ports...&amp;#34;&lt;br/&gt;sudo ss -tulpn | grep tor&lt;br/&gt;&lt;br/&gt;# Step 5: Configure nftables&lt;br/&gt;echo &amp;#34;[*] Writing nftables configuration...&amp;#34;&lt;br/&gt;sudo tee /etc/nftables.conf &amp;gt;/dev/null &amp;lt;&amp;lt;EOF&lt;br/&gt;#!/usr/sbin/nft -f&lt;br/&gt;&lt;br/&gt;flush ruleset&lt;br/&gt;&lt;br/&gt;define uid = ${TOR_UID}&lt;br/&gt;&lt;br/&gt;define waydroid_net = 192.168.240.0/24&lt;br/&gt;&lt;br/&gt;define unrouteables = {&lt;br/&gt;    127.0.0.0/8,&lt;br/&gt;    10.0.0.0/8,&lt;br/&gt;    172.16.0.0/12,&lt;br/&gt;    192.168.0.0/16,&lt;br/&gt;    0.0.0.0/8,&lt;br/&gt;    100.64.0.0/10,&lt;br/&gt;    169.254.0.0/16,&lt;br/&gt;    192.0.0.0/24,&lt;br/&gt;    192.0.2.0/24,&lt;br/&gt;    192.88.99.0/24,&lt;br/&gt;    198.18.0.0/15,&lt;br/&gt;    198.51.100.0/24,&lt;br/&gt;    203.0.113.0/24,&lt;br/&gt;    224.0.0.0/4,&lt;br/&gt;    240.0.0.0/4&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;table ip nat {&lt;br/&gt;    set unrouteables {&lt;br/&gt;        type ipv4_addr&lt;br/&gt;        flags interval&lt;br/&gt;        elements = \$unrouteables&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    chain prerouting {&lt;br/&gt;        type nat hook prerouting priority dstnat; policy accept;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    chain postrouting {&lt;br/&gt;        type nat hook postrouting priority srcnat; policy accept;&lt;br/&gt;&lt;br/&gt;        oifname != &amp;#34;waydroid0&amp;#34; ip saddr \$waydroid_net counter masquerade&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    chain output {&lt;br/&gt;        type nat hook output priority dstnat; policy accept;&lt;br/&gt;&lt;br/&gt;        ct state established,related accept&lt;br/&gt;&lt;br/&gt;        ip daddr \$waydroid_net return&lt;br/&gt;        ip saddr \$waydroid_net return&lt;br/&gt;&lt;br/&gt;        meta l4proto tcp ip daddr 10.192.0.0/10 redirect to :9040&lt;br/&gt;&lt;br/&gt;        ip daddr 127.0.0.1 udp dport 53 redirect to :9053&lt;br/&gt;&lt;br/&gt;        meta skuid \$uid return&lt;br/&gt;&lt;br/&gt;        oifname &amp;#34;lo&amp;#34; return&lt;br/&gt;&lt;br/&gt;        ip daddr @unrouteables return&lt;br/&gt;&lt;br/&gt;        meta l4proto tcp redirect to :9040&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;table ip filter {&lt;br/&gt;    set unrouteables {&lt;br/&gt;        type ipv4_addr&lt;br/&gt;        flags interval&lt;br/&gt;        elements = \$unrouteables&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    chain input {&lt;br/&gt;        type filter hook input priority filter; policy drop;&lt;br/&gt;&lt;br/&gt;        ct state established,related accept&lt;br/&gt;        iifname &amp;#34;lo&amp;#34; accept&lt;br/&gt;&lt;br/&gt;        iifname &amp;#34;waydroid0&amp;#34; udp dport { 53, 67 } accept&lt;br/&gt;        iifname &amp;#34;waydroid0&amp;#34; tcp dport { 53, 67 } accept&lt;br/&gt;&lt;br/&gt;        counter log prefix &amp;#34;TOR-INPUT-DROP: &amp;#34; drop&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    chain forward {&lt;br/&gt;        type filter hook forward priority filter; policy drop;&lt;br/&gt;&lt;br/&gt;        ct state established,related accept&lt;br/&gt;&lt;br/&gt;        iifname &amp;#34;waydroid0&amp;#34; oifname != &amp;#34;waydroid0&amp;#34; accept&lt;br/&gt;        iifname != &amp;#34;waydroid0&amp;#34; oifname &amp;#34;waydroid0&amp;#34; ct state established,related accept&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    chain output {&lt;br/&gt;        type filter hook output priority filter; policy drop;&lt;br/&gt;&lt;br/&gt;        ct state established,related accept&lt;br/&gt;&lt;br/&gt;        oifname &amp;#34;lo&amp;#34; accept&lt;br/&gt;&lt;br/&gt;        ip daddr \$waydroid_net accept&lt;br/&gt;        oifname &amp;#34;waydroid0&amp;#34; accept&lt;br/&gt;&lt;br/&gt;        meta skuid \$uid accept&lt;br/&gt;&lt;br/&gt;        ip daddr @unrouteables accept&lt;br/&gt;&lt;br/&gt;        meta l4proto tcp accept&lt;br/&gt;&lt;br/&gt;        udp dport 53 accept&lt;br/&gt;&lt;br/&gt;        counter log prefix &amp;#34;TOR-KILLSWITCH: &amp;#34; drop&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;EOF&lt;br/&gt;&lt;br/&gt;# Step 6: Validate and apply nftables&lt;br/&gt;echo &amp;#34;[*] Validating nftables configuration...&amp;#34;&lt;br/&gt;sudo nft -c -f /etc/nftables.conf&lt;br/&gt;&lt;br/&gt;echo &amp;#34;[*] Applying nftables rules...&amp;#34;&lt;br/&gt;sudo nft -f /etc/nftables.conf&lt;br/&gt;&lt;br/&gt;# Step 7: Enable and start nftables&lt;br/&gt;echo &amp;#34;[*] Enabling nftables service...&amp;#34;&lt;br/&gt;sudo systemctl enable nftables&lt;br/&gt;sudo systemctl start nftables&lt;br/&gt;&lt;br/&gt;# Step 8: Show active ruleset&lt;br/&gt;echo &amp;#34;[*] Current nftables ruleset:&amp;#34;&lt;br/&gt;sudo nft list ruleset&lt;br/&gt;&lt;br/&gt;# Step 9: Verify Tor connectivity&lt;br/&gt;echo &amp;#34;[*] Checking Tor connectivity...&amp;#34;&lt;br/&gt;curl -s &lt;a href=&#34;https://check.torproject.org&#34;&gt;https://check.torproject.org&lt;/a&gt; | grep -i &amp;#34;congratulations\|sorry&amp;#34;
    </content>
    <updated>2026-07-05T09:23:37Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszfqcp3dssjkwypghsp6ugck98qudvyn57s3qwqka74dec3l3zqcqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303239w5pp</id>
    
      <title type="html">Tails на телефоне. Создаем ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszfqcp3dssjkwypghsp6ugck98qudvyn57s3qwqka74dec3l3zqcqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303239w5pp" />
    <content type="html">
      Tails на телефоне. Создаем зашифрованную мобильную ОС, которая будет терять все данные после перезагрузки. &lt;br/&gt;&lt;br/&gt;Сначала устанавливаем Mobian - дебиан для телефонов (проще всего на старый pixel 3a, который можно купить за 3 копейки). Для полнодискового шифрования нужно собрать ОС. &lt;br/&gt;устанавливаем зависимости и клонируем репозиторий&lt;br/&gt;&lt;br/&gt;sudo apt install debos bmap-tools xz-utils android-sdk-libsparse-utils yq mkbootimg cryptsetup&lt;br/&gt;&lt;br/&gt;git clone &lt;a href=&#34;https://salsa.debian.org/Mobian-team/mobian-recipes.git&#34;&gt;https://salsa.debian.org/Mobian-team/mobian-recipes.git&lt;/a&gt; -b mobian-trixie&lt;br/&gt;cd mobian-recipes&lt;br/&gt; &lt;br/&gt;и запускаем сборку указав свой пароль от диска (sdm670 - это для pixel)&lt;br/&gt;&lt;br/&gt;./build.sh -t sdm670 -c -R &amp;lt;password&amp;gt;&lt;br/&gt;&lt;br/&gt;после сборки ставим образ в телефон&lt;br/&gt;sudo apt install adb fastboot google-android-platform-tools-installer&lt;br/&gt;включаем режим разработчика: Настройки → Система → Об устройстве → 7 раз нажми &amp;#34;Номер сборки&amp;#34;&lt;br/&gt;включаем OEM-разблокировку: Настройки → Система → Параметры разработчика → &amp;#34;Разблокировка OEM&amp;#34;&lt;br/&gt;перезагружаем в fastboot: power &#43; volume down при выключенном устройстве.&lt;br/&gt;затем вводим эти команды&lt;br/&gt;fastboot flashing unlock&lt;br/&gt;fastboot flash boot mobian-*-phosh-*.boot-sargo.img #название созданного boot-sargo.img&lt;br/&gt;fastboot -S 100M flash userdata mobian-*-phosh-*.rootfs.img #название созданного rootfs.img&lt;br/&gt;fastboot erase dtbo&lt;br/&gt;fastboot oem uart enable&lt;br/&gt;fastboot reboot&lt;br/&gt;и вводим пароль шифрования при запуске системы. дефолтный пинкод будет 1234. система установлена, продолжение ниже.
    </content>
    <updated>2026-07-05T09:19:51Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsq5vtmvmarvy3qx4huryluddzysqm2ekhh9g5sn2um6nlq79kwjxszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630322grt2d</id>
    
      <title type="html">upd: this bug android 17, not graphene os.</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsq5vtmvmarvy3qx4huryluddzysqm2ekhh9g5sn2um6nlq79kwjxszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630322grt2d" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsgqrg55l53u9yxwns58tvxf4q47ulqhrxp5mxfk4came6d9tn7ywq23qu46&#39;&gt;nevent1q…qu46&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;upd: this bug android 17, not graphene os. 
    </content>
    <updated>2026-06-28T04:08:33Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs25fzl2xv08rl8x2z4k9pk5qsatm65grtujm09g7wrg968zy273dszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032r0apr8</id>
    
      <title type="html">upd: connecting phone to pc is working. only sim card problem.</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs25fzl2xv08rl8x2z4k9pk5qsatm65grtujm09g7wrg968zy273dszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032r0apr8" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsgqrg55l53u9yxwns58tvxf4q47ulqhrxp5mxfk4came6d9tn7ywq23qu46&#39;&gt;nevent1q…qu46&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;upd: connecting phone to pc is working. only sim card problem. 
    </content>
    <updated>2026-06-27T15:05:59Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsgqrg55l53u9yxwns58tvxf4q47ulqhrxp5mxfk4came6d9tn7ywqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032emn80u</id>
    
      <title type="html">@npub1hxx…g75y after update graphene os, physical sim card ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsgqrg55l53u9yxwns58tvxf4q47ulqhrxp5mxfk4came6d9tn7ywqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032emn80u" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1hxx76n82ags8jrduk0p3gqrfyqyaxnrlnynu9p5rt2vmwjq6ts3q4sg75y&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;AmberFinal&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1hxx…g75y&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  after update graphene os, physical sim card won&amp;#39;t turn on - nothing happens after pressing &amp;#34;turn on sim&amp;#34;. also phone is not visible on pc when connected via usb. problems only in android 17. check please. 
    </content>
    <updated>2026-06-27T14:04:54Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsp8uk7a4gq0582keqev2zr3xchht7wzw4lznv2q0dqwl5zsxgpluqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032aye4jd</id>
    
      <title type="html">@npub142g…xrj0 @npub1gcx…nj5z @npub1utx…50e8 ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsp8uk7a4gq0582keqev2zr3xchht7wzw4lznv2q0dqwl5zsxgpluqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032aye4jd" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub142gywvjkq0dv6nupggyn2euhx4nduwc7yz5f24ah9rpmunr2s39se3xrj0&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;amethyst&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub142g…xrj0&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;VitorPamplona&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1gcx…nj5z&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1utx00neqgqln72j22kej3ux7803c2k986henvvha4thuwfkper4s7r50e8&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;utxo the webmaster 🧑‍💻🍁&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1utx…50e8&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt; &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1wspt4lk6zj398fjsd8zzuyjyuckp3hecy9gy5zasv8zwntexp5tsh37rqf&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Wisp&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1wsp…7rqf&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  Please add a pincode in Amethyst and Dark Wisp to encrypt an account database  
    </content>
    <updated>2026-06-24T05:15:24Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs0mtv5e5w749w7zck7lvj5fq070k5m4ly4l3q6szpyw3qamwlq0fqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032zqpe7v</id>
    
      <title type="html">chainflip.io добавил поддержку сети tron и ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs0mtv5e5w749w7zck7lvj5fq070k5m4ly4l3q6szpyw3qamwlq0fqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032zqpe7v" />
    <content type="html">
      chainflip.io добавил поддержку сети tron и теперь это точно лучший кроссчейн-обменник для децентрализованной покупки чистого нативного биткоина на стейблкоины из сетей ethereum, solana, tron без kyc. chainflip имеет встроенный aml и хакерские битки там не пройдут. chainflip прошел кучу аудитов и имеет лучшие оценки безопасности для кроссчейнов с нативным битком на hindenrank. и там нет mev-атак при свопах ethereum. 
    </content>
    <updated>2026-06-21T13:16:19Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2qcudc7xuwc8h8q8kh65gw77f754c6nn34j5l0jx0z0e97e8nntczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630328l5q8w</id>
    
      <title type="html">RuStore это не магазин, а пегасус с ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2qcudc7xuwc8h8q8kh65gw77f754c6nn34j5l0jx0z0e97e8nntczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630328l5q8w" />
    <content type="html">
      RuStore это не магазин, а пегасус с арсеналом шпионажа за телефоном похлеще гуглов.&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://habr.com/ru/articles/1046710/&#34;&gt;https://habr.com/ru/articles/1046710/&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;А это РуСтор &amp;#34;здорового человека&amp;#34; (хотя, сейчас все рус приложения - пегасусы: от яндексов до авито и сбера).&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://codeberg.org/mi6e4ka/openstore&#34;&gt;https://codeberg.org/mi6e4ka/openstore&lt;/a&gt; 
    </content>
    <updated>2026-06-12T08:36:32Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsr96jvwpjvvmhp6225xdlcsvh2f4clwexsmjqhqyza8hf4a2asmlczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032j9n6xa</id>
    
      <title type="html">самый удобный открытокодный ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsr96jvwpjvvmhp6225xdlcsvh2f4clwexsmjqhqyza8hf4a2asmlczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032j9n6xa" />
    <content type="html">
      самый удобный открытокодный антидетект браузер из всех, что пока попадались. если говорить об удобстве и простоте.&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://github.com/ProxyShard/ShardBrowser&#34;&gt;https://github.com/ProxyShard/ShardBrowser&lt;/a&gt; 
    </content>
    <updated>2026-06-09T11:26:01Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsx0gt92wrmtjktljdgkqtejmvrtgp0zzmr63c4jlun9a5f8lfq2vgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032hwv7ks</id>
    
      <title type="html">новый ресурс, претендующий на ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsx0gt92wrmtjktljdgkqtejmvrtgp0zzmr63c4jlun9a5f8lfq2vgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032hwv7ks" />
    <content type="html">
      новый ресурс, претендующий на звание лучшего хаба вселенной #Nostr&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://nostrhub.io/&#34;&gt;https://nostrhub.io/&lt;/a&gt; 
    </content>
    <updated>2026-06-03T17:27:50Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsv0h975m3al8r3s3fsgtuhdj8fwx7ze9l5qzu4026txmxns4hdmzszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032cl7ykx</id>
    
      <title type="html">about telegram &amp;#34;privacy&amp;#34; ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsv0h975m3al8r3s3fsgtuhdj8fwx7ze9l5qzu4026txmxns4hdmzszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032cl7ykx" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsyupyjyvzhan3sv3mk8ksn8dlfm00vkarr4lmfxh4s9rxrzne3kkq37zlsu&#39;&gt;nevent1q…zlsu&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;about telegram &amp;#34;privacy&amp;#34; &lt;a href=&#34;https://www.whonix.org/wiki/Telegram&#34;&gt;https://www.whonix.org/wiki/Telegram&lt;/a&gt; 
    </content>
    <updated>2026-05-27T08:15:51Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqstx36vms5m4eslmp8c3j7en5dt5spnymg8dckps3ewpk5mcm27g7gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032re3maj</id>
    
      <title type="html">только в репозиториях самих ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqstx36vms5m4eslmp8c3j7en5dt5spnymg8dckps3ewpk5mcm27g7gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032re3maj" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrtqxv6dpn9tgqhah6a58tpxw9y5vv6fyvmcg7zu7nuqyjn90nkfs5ewd5y&#39;&gt;nevent1q…wd5y&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;только в репозиториях самих клиентов если. нет такого сайта, где вот прям все все клиенты собраны, т.к. клиентов всё больше, постоянно новые появляются. звонки пока добавлены в amethyst, 0xchat, nospeak. в общем, в отличие от джабьера, тут всё сложнее, т.к. клиентов намного больше и это мы говорим только о соцсети - еще вспомогательных ностр-тулзов десятки. 
    </content>
    <updated>2026-05-25T19:04:23Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsf34gwgq3p2f2q64e04cttz394j88qge7fmyj46nll7dc6hq2x7kgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032yw034x</id>
    
      <title type="html">I can&amp;#39;t see notes from private contacts, notes from ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsf34gwgq3p2f2q64e04cttz394j88qge7fmyj46nll7dc6hq2x7kgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032yw034x" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsgasxeg4gt25upz53xc6zczkd3z9t38jwxak2zzuaafl2a9ykchfsd2fls4&#39;&gt;nevent1q…fls4&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;I can&amp;#39;t see notes from private contacts, notes from relay-bridges (ditto.pub mostr.pub and nostr.data.haus). these problems didn&amp;#39;t exist in the old versions 1.06 &amp;gt;&lt;br/&gt;&lt;br/&gt;App has improved a lot functionally, but now it is impossible to use it to read and search for notes - many notes have disappeared 
    </content>
    <updated>2026-05-21T05:16:16Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2slmxj5mxf4fhsl5l7t5sl4nra3emga27f02hf5ft9ctnjz995wszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032wg92p2</id>
    
      <title type="html">Zapstore - мой любимый магазин ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2slmxj5mxf4fhsl5l7t5sl4nra3emga27f02hf5ft9ctnjz995wszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032wg92p2" />
    <content type="html">
      Zapstore - мой любимый магазин приложений. Заслужил грант. &lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/note15a3vj88m4j38gk4ac5ep6tfq96qua5huke2895shexnvl7s0443qmlcjrl&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;note15a3…cjrl&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; New wave of nostr grants: 44Billion, NosCall, Routstr, Wisp, and Zapstore.&lt;br/&gt;&lt;a href=&#34;https://opensats.org/blog/seventeenth-wave-of-nostr-grants&#34;&gt;https://opensats.org/blog/seventeenth-wave-of-nostr-grants&lt;/a&gt; &lt;/blockquote&gt;
    </content>
    <updated>2026-05-20T16:21:44Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszdfagy63q8mcq52jqcw95al9xt25u5gx8wftxh9sxt944kdxfjzczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032lukz40</id>
    
      <title type="html">Скиньте дырову, когда он снова ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszdfagy63q8mcq52jqcw95al9xt25u5gx8wftxh9sxt944kdxfjzczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032lukz40" />
    <content type="html">
      Скиньте дырову, когда он снова будет постить всякую хуйню про ультра-приватность в телеге. Аудит подъехал.&lt;br/&gt;&lt;br/&gt;Telegram&amp;#39;s MTProto: Assessing Deanonymization Potential for a Network Attacker.&lt;br/&gt;Dr. Nadim Kobeissi&lt;br/&gt;Symbolic Software&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://static.istories.media/uploaded/documents/d92f02fe94f64906887d290489e26d14.pdf&#34;&gt;https://static.istories.media/uploaded/documents/d92f02fe94f64906887d290489e26d14.pdf&lt;/a&gt; 
    </content>
    <updated>2026-05-18T10:27:42Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsd8c5yy09kh5dvqu2rmw6qc7xh6md43rxl08meztnx5ah8vgtmfrqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032xhuzcw</id>
    
      <title type="html">@npub142g…xrj0 also I don&amp;#39;t see notes from relay.data.haus ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsd8c5yy09kh5dvqu2rmw6qc7xh6md43rxl08meztnx5ah8vgtmfrqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032xhuzcw" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsgtmm4cltuh9cs4l7uvg6g4zqc6nw7talh4zm2g6tuut87flaraygccq30n&#39;&gt;nevent1q…q30n&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub142gywvjkq0dv6nupggyn2euhx4nduwc7yz5f24ah9rpmunr2s39se3xrj0&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;amethyst&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub142g…xrj0&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  also I don&amp;#39;t see notes from relay.data.haus (rss). it works well in 0xchat and worked in the last version of Amethyst 
    </content>
    <updated>2026-05-17T05:24:01Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsgtmm4cltuh9cs4l7uvg6g4zqc6nw7talh4zm2g6tuut87flaraygzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032vadjvh</id>
    
      <title type="html">@npub142g…xrj0 @npub1gcx…nj5z I don&amp;#39;t see notes from my ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsgtmm4cltuh9cs4l7uvg6g4zqc6nw7talh4zm2g6tuut87flaraygzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032vadjvh" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsd5nnaszn6vw6lsqclnjtrtntyajcw9mvdhg8zqw0n6n9ulfp509sgg9cv7&#39;&gt;nevent1q…9cv7&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub142gywvjkq0dv6nupggyn2euhx4nduwc7yz5f24ah9rpmunr2s39se3xrj0&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;amethyst&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub142g…xrj0&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;VitorPamplona&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1gcx…nj5z&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;   I don&amp;#39;t see notes from my private contacts in my feed, don&amp;#39;t see notes from mastodon accounts with ditto-mostr relay, don&amp;#39;t see some of my notes and some of my subscribers after the latest updates. check it please. 
    </content>
    <updated>2026-05-17T04:50:31Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsfmcarch58gdr83xt6ey8fea6kfrpdnnwkmnwkfeem3xd6ntm4d0gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303265quyk</id>
    
      <title type="html">я думаю, сейчас постепенно все ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsfmcarch58gdr83xt6ey8fea6kfrpdnnwkmnwkfeem3xd6ntm4d0gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303265quyk" />
    <content type="html">
      я думаю, сейчас постепенно все клиенты ностр будут переходить к золотому стандарту: поддержка звонков, мармот е2ее чатов с прямой секретностью, тор/прокси, приватных подписок, шифрования локальной базы данных &#43; всякие штуки из телеги: анимированные стикеры и тд. &lt;br/&gt;этот год будет поворотным в крутых обновлениях, будут закрыты последние баги, и ностр станет фантастической мега удобной соцсетью с высоченным уровнем приватности, децентрализации и свободы. 
    </content>
    <updated>2026-05-16T05:07:48Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsy7f23ah9yyluee078tc8nmh5u720ulwnrfy2wzglcn5vr8e9s54czyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032tpys5n</id>
    
      <title type="html">бомба! аметист становится ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsy7f23ah9yyluee078tc8nmh5u720ulwnrfy2wzglcn5vr8e9s54czyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032tpys5n" />
    <content type="html">
      бомба! аметист становится действительно топовым клиентом nostr. приватность, анонимность и куча крутых функций. &lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/note1kxu36lhqchdf6zqarff5wqjgaezctvzckyd2xnlz3s8rupavrc9qmz8cy8&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;note1kxu…8cy8&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; #Amethyst v1.09.0: We are going crazy&lt;br/&gt;&lt;br/&gt;- Go live on audio spaces (Nests)&lt;br/&gt;- Marmot Group chats (WhiteNoise)&lt;br/&gt;- Voice and Video calls (Noscall)&lt;br/&gt;- PDF reader&lt;br/&gt;- Favorite algo feeds&lt;br/&gt;- HLS Video Uploads&lt;br/&gt;- Schedule posts for later&lt;br/&gt;- Cast videos to your TV (Chromecast)&lt;br/&gt;- Mute a whole conversation thread&lt;br/&gt;- Pull Notification (internal Pokey)&lt;br/&gt;- Local LLMs (Pixel 9&#43;, Samsung 25&#43;, Xiaomi 15&#43;)&lt;br/&gt;- `amy`, a command-line Nostr client&lt;br/&gt;&lt;br/&gt;## Features&lt;br/&gt;&lt;br/&gt;- Voice and Video Calls (NIP-AC) — one-on-one and group WebRTC calls.&lt;br/&gt;  - Full-screen incoming-call UI over the lock screen.&lt;br/&gt;  - PiP, ringtone and vibration.&lt;br/&gt;  - Proximity sensor support.&lt;br/&gt;  - Bluetooth headset routing.&lt;br/&gt;  - Camera switch.&lt;br/&gt;  - Network resilience and default TURN servers.&lt;br/&gt;  - Mid-call peer invites with a 30s timeout and per-peer status.&lt;br/&gt;  - Settings toggle to disable calls.&lt;br/&gt;- Audio Rooms / Nests (NIP-53) — a full revamp.&lt;br/&gt;  - Live chat panel.&lt;br/&gt;  - Reactions overlay and picker.&lt;br/&gt;  - Listener counter.&lt;br/&gt;  - Presence with publishing/onstage tags.&lt;br/&gt;  - Hand-raise queue.&lt;br/&gt;  - Host actions: kick, promote, demote, edit, close room.&lt;br/&gt;  - Per-participant context sheet.&lt;br/&gt;  - Scheduled rooms with a TimePicker and SCHEDULED badge.&lt;br/&gt;  - &#34;Listen to recording&#34; CTA for closed rooms.&lt;br/&gt;  - Share a room as `naddr1`.&lt;br/&gt;  - Custom room themes and fonts (kind 30312).&lt;br/&gt;  - Home live-bubble row showing follows broadcasting.&lt;br/&gt;  - Host-leave confirmation and default-server prompt.&lt;br/&gt;  - In-app lobby with a chat composer, gating room re-entry.&lt;br/&gt;  - PiP that focuses active speakers.&lt;br/&gt;  - Feed bucketed into Live / Scheduled / Recently ended, with live status verified by current presence.&lt;br/&gt;  - Live audio-level speaker ring.&lt;br/&gt;  - Keeps the screen on while connected.&lt;br/&gt;  - Audio plays through the media volume stream.&lt;br/&gt;- Marmot Encrypted Group Chats (MLS over Nostr / NIP-EE)&lt;br/&gt;  - Create, join and leave groups.&lt;br/&gt;  - Inline group rendering in Messages.&lt;br/&gt;  - Member management with user search.&lt;br/&gt;  - Admin grant/revoke.&lt;br/&gt;  - Group info screen with picture, member list and per-relay freshness.&lt;br/&gt;  - Auto-publish KeyPackage.&lt;br/&gt;  - Reset Marmot State safety valve in Settings.&lt;br/&gt;  - Full RFC 9420 compliance pass (P0/P1/P2).&lt;br/&gt;  - External Commit flow.&lt;br/&gt;  - Retained-epoch decryption for offline catch-up.&lt;br/&gt;  - Required-capabilities advertised on groups; interop fixes for other Marmot clients.&lt;br/&gt;  - Popup notifications for group messages (kind:445).&lt;br/&gt;- Multi-account on Desktop&lt;br/&gt;  - Account switcher dropdown in the sidebar and single-pane layout.&lt;br/&gt;  - Add Account dialog and per-account logout.&lt;br/&gt;  - View-only (npub-only) accounts.&lt;br/&gt;  - Account removal switches to another account or logs out cleanly.&lt;br/&gt;  - Encrypted local account storage (AES-256-GCM).&lt;br/&gt;  - Display names and middle-truncated npubs.&lt;br/&gt;- Schedule posts for later&lt;br/&gt;  - Date/time picker and toolbar toggle in the post composer.&lt;br/&gt;  - Dedicated screen and drawer entry to view, push or delete scheduled posts.&lt;br/&gt;  - Background worker that publishes at the scheduled time.&lt;br/&gt;  - Warning when scheduling without always-on notifications.&lt;br/&gt;- Cast videos to your TV&lt;br/&gt;  - Chromecast casting (Google Play build only).&lt;br/&gt;  - Stop-from-phone button; the local player pauses while casting.&lt;br/&gt;  - Cast button backfilled for accounts that already had video settings.&lt;br/&gt;- Mute a whole thread&lt;br/&gt;  - Mute thread entry in the long-press dropdown and quick-action sheet.&lt;br/&gt;  - Muted threads listed in Security Filters with an unmute action.&lt;br/&gt;  - Muted threads dropped from feeds, notifications and push delivery.&lt;br/&gt;- Configurable home tabs&lt;br/&gt;  - Choose between New Threads, Conversations and Everything.&lt;br/&gt;  - Visibility toggles persist across restarts.&lt;br/&gt;- Configurable bottom navigation bar&lt;br/&gt;  - Pick which screens appear in the bottom bar.&lt;br/&gt;  - Restore-default button in settings.&lt;br/&gt;- Reply and Mention notifications (NIP-10 / NIP-22)&lt;br/&gt;  - Dedicated Mentions channel.&lt;br/&gt;  - Per-thread grouping.&lt;br/&gt;  - Inline reply.&lt;br/&gt;  - All content-event citations routed to Mentions.&lt;br/&gt;  - Opt-in Following / Everyone tab split.&lt;br/&gt;- Filter the home feed in place by hashtag, community, geohash and relay (no navigation away)&lt;br/&gt;- Hashtag and geohash top-nav filters on Pictures, Shorts, Articles, Polls and Products&lt;br/&gt;- NIP-22 comments on external content (hashtags, geohashes, URLs) render a typed reply-context chip and land in the conversations feed&lt;br/&gt;- Interest Sets (NIP-51, kind 30015)&lt;br/&gt;  - List, create, rename, delete and clone interest sets.&lt;br/&gt;  - Public/private hashtag toggle.&lt;br/&gt;  - TopNav filter chips.&lt;br/&gt;- NIP-9A Community Rules&lt;br/&gt;  - Structured rules editor in the new-community flow.&lt;br/&gt;  - Post validation against community rules in the composer.&lt;br/&gt;  - Opt-in moderation feed filter.&lt;br/&gt;- PDF reader&lt;br/&gt;  - Inline PDF previews in feeds.&lt;br/&gt;  - Double-tap to toggle zoom.&lt;br/&gt;  - Zoom-aware hi-res re-render for crisp pinch-zoom.&lt;br/&gt;  - Download and save PDFs to Downloads/Amethyst.&lt;br/&gt;- Multi-wallet NWC&lt;br/&gt;  - Multiple wallets with a balance view.&lt;br/&gt;  - Default picker, rename and reorder.&lt;br/&gt;  - Dedicated Add Wallet screen with Connect Wallet / paste / QR scan.&lt;br/&gt;- Favorite Algo Feeds filter in the Top Nav Bar&lt;br/&gt;- Custom Post creation on Polls / Pictures / Shorts / Longs&lt;br/&gt;- Custom Emoji Packs (NIP-30)&lt;br/&gt;  - Browse Emoji Sets screen for discovering kind 30030 packs.&lt;br/&gt;  - My Emoji List screen for managing your kind 10030 selection.&lt;br/&gt;  - Modernized pack metadata screen with hero image and inline emoji/cover upload.&lt;br/&gt;  - Public/private toggle when adding emoji.&lt;br/&gt;  - Decrypted private emojis surfaced end-to-end.&lt;br/&gt;- Dedicated drawer screens for more content types.&lt;br/&gt;  - Standalone Articles, Products, Public Chats, Communities (NIP-72), Live Streams and Follow Packs screens.&lt;br/&gt;  - Products screen defaults to &#34;Around Me&#34;.&lt;br/&gt;- Richer live stream chat.&lt;br/&gt;  - Inline clips (kind 1313) and raids (kind 1312).&lt;br/&gt;  - Inline zap receipts.&lt;br/&gt;  - NIP-75 zap goal pinned at the top.&lt;br/&gt;  - Top zappers leaderboard.&lt;br/&gt;  - Stream clips surfaced in the profile gallery tab.&lt;br/&gt;- Content warnings on media.&lt;br/&gt;  - Grid-level content warnings with distinct reasons.&lt;br/&gt;  - Warning overlaid on the blurhash at media size.&lt;br/&gt;- YouTube-style video quality picker.&lt;br/&gt;  - Feed and PiP default to the lowest HLS resolution.&lt;br/&gt;  - Fullscreen defaults to auto.&lt;br/&gt;- HLS Video uploads (NIP-71)&lt;br/&gt;  - Pick which renditions to upload.&lt;br/&gt;  - See which file is currently uploading.&lt;br/&gt;  - Optional cross-post as a kind-1 note.&lt;br/&gt;  - Generated poster JPEG.&lt;br/&gt;  - Blurhash and thumbhash on every video imeta.&lt;br/&gt;- ThumbHash support alongside BlurHash&lt;br/&gt;  - Used across events, uploads and the UI.&lt;br/&gt;  - Forwarded when adding media to the gallery.&lt;br/&gt;  - Upload failures to generate a blurhash/thumbhash are now surfaced.&lt;br/&gt;- NIP-A3 Payment Targets (kind 10133)&lt;br/&gt;  - Pay action on the note reactions row.&lt;br/&gt;  - Payment-targets button on the profile.&lt;br/&gt;  - Lightning address moved to the wallet setup screen.&lt;br/&gt;  - Alt-text on payment-target events.&lt;br/&gt;- Search power tools&lt;br/&gt;  - Scope, source, follows and sort toggles.&lt;br/&gt;  - Paste an `npub1…`, `nprofile1…`, `nevent1…`, `naddr1…` or `note1…` to jump straight to it.&lt;br/&gt;- Markdown renderer — improved typography, blockquote gutter, table styling&lt;br/&gt;- Polls&lt;br/&gt;  - Single-screen creation with a poll-type selector.&lt;br/&gt;  - Open/Closed tabs.&lt;br/&gt;  - &#34;View results&#34; option (prevents voting after viewing).&lt;br/&gt;  - Dismiss button on active-poll cards.&lt;br/&gt;- Badge support Redesigned — You can now create, grant, manage and add/remove badges from your profile.&lt;br/&gt;- Settings revamp&lt;br/&gt;  - Modernized Settings screen.&lt;br/&gt;  - Dedicated Profile UI settings page.&lt;br/&gt;  - Compose Settings screen (auto-draft toggle).&lt;br/&gt;  - Security Filters split into a hub with per-category screens.&lt;br/&gt;- Tap a timestamp to toggle between relative (&#34;2h ago&#34;) and absolute date/time, driven by a single shared ticker&lt;br/&gt;- Copy raw JSON of a note from the dropdown menu&lt;br/&gt;- Stale-relay hint on replaceable events, using the NIP-66 relay cache&lt;br/&gt;- Two-stage zap progress on the zap action&lt;br/&gt;- Bulk-remove for blocked users and hidden words&lt;br/&gt;- Jump-to-parent icon on replies in Full UI mode&lt;br/&gt;- Configurable report-warning threshold&lt;br/&gt;- `.f4a` audio playback&lt;br/&gt;&lt;br/&gt;## In AI-Ready phones (Pixel 9&#43;, Samsung 25&#43;, Xiaomi 15&#43;):&lt;br/&gt;- AI Writing Help — assistant in the new-post screen.&lt;br/&gt;  - Tone suggestions, precomputed in parallel.&lt;br/&gt;  - Auto language detection.&lt;br/&gt;  - On-device option in Application Preferences.&lt;br/&gt;- AI Alt-Text for images — on-device image description / labeling.&lt;br/&gt;  - Suggestions appear in the upload sheet (Google Play build).&lt;br/&gt;&lt;br/&gt;## Desktop&lt;br/&gt;&lt;br/&gt;- Tor Support — full Tor support on the desktop app.&lt;br/&gt;  - kmp-tor daemon and settings UI.&lt;br/&gt;  - Per-relay routing.&lt;br/&gt;  - `.onion` badge.&lt;br/&gt;  - Restart-on-toggle.&lt;br/&gt;  - Image loading via Tor.&lt;br/&gt;- Multi-account&lt;br/&gt;  - Sidebar account switcher.&lt;br/&gt;  - Add Account dialog and per-account logout.&lt;br/&gt;  - Encrypted account storage.&lt;br/&gt;- Embedded local relay — an in-process relay with SQLite event persistence&lt;br/&gt;- Custom feeds system&lt;br/&gt;  - Create, pin and inline-switch between custom feeds.&lt;br/&gt;  - Author search in the feed builder (relay NIP-50 &#43; avatars).&lt;br/&gt;- App Drawer with a categorized screen launcher&lt;br/&gt;- Workspace management&lt;br/&gt;  - Save, switch and restore workspaces.&lt;br/&gt;  - Tabs, an editor and unified search.&lt;br/&gt;  - Pin/unpin syncs to the active workspace.&lt;br/&gt;- Namecoin name resolution&lt;br/&gt;  - Namecoin lookups now resolve and surface in search.&lt;br/&gt;  - Follows the `import` field of name objects (ifa-0001).&lt;br/&gt;  - Added `relay.testls.bit` ElectrumX endpoints (clearnet TLS, Tor, bare IP).&lt;br/&gt;- Native theming for macOS, GNOME, KDE and Windows (matches platform look and accent colors)&lt;br/&gt;- Relay power tools&lt;br/&gt;  - Dashboard and config editors.&lt;br/&gt;  - Per-screen relay picker.&lt;br/&gt;  - Persistent configuration.&lt;br/&gt;  - Correct counts.&lt;br/&gt;- Messages&lt;br/&gt;  - Draggable divider.&lt;br/&gt;  - Alignment polish and centered empty states.&lt;br/&gt;  - Typography hierarchy and refined dividers.&lt;br/&gt;- macOS polish&lt;br/&gt;  - Dock / Cmd&#43;Tab icon via the Taskbar API.&lt;br/&gt;  - Apple-HIG squircle margins.&lt;br/&gt;  - Transparent window icon.&lt;br/&gt;  - Light-mode primary contrast.&lt;br/&gt;  - Content extends correctly under the title bar.&lt;br/&gt;- Reading layout — width-capped reading column with comfortable side margins for wide windows&lt;br/&gt;- Compact UI&lt;br/&gt;  - Search/Chat/Profile inputs.&lt;br/&gt;  - Settings hierarchy normalized.&lt;br/&gt;  - Tabs-first headers across Home / Reads / Notifications.&lt;br/&gt;  - Whole-card hover on notes.&lt;br/&gt;- Per-OS theming preview flag for testing macOS/GNOME/KDE/Windows looks locally&lt;br/&gt;- Selectable error messages.&lt;br/&gt;- Scrollable single-pane navigation rail.&lt;br/&gt;- Fixes feed loading, repost rendering and Profile back-navigation visibility.&lt;br/&gt;&lt;br/&gt;## Amy (CLI)&lt;br/&gt;&lt;br/&gt;- New `amy`, a non-interactive CLI Nostr client.&lt;br/&gt;  - Drives the same Quartz &#43; Commons engine as the apps.&lt;br/&gt;  - Available on macOS and Linux from the GitHub Release.&lt;br/&gt;- Subcommands:&lt;br/&gt;  - `account` / `use`, `profile`, `post`, `feed`, `notes`.&lt;br/&gt;  - `dm send | list | await | send-file` (NIP-17, kind:14 &#43; kind:15).&lt;br/&gt;  - `marmot …`.&lt;br/&gt;  - `store stat | sweep-expired | scrub | compact`.&lt;br/&gt;- Cache-first reads from a local file-backed event store.&lt;br/&gt;  - `relays.json` is gone — `kind:10002 / 10050 / 10051` events in the store *are* the config.&lt;br/&gt;- Secure key storage.&lt;br/&gt;  - Private keys move out of `identity.json` into the OS keychain or a NIP-49 encrypted file.&lt;br/&gt;  - On-disk data restricted to owner-only.&lt;br/&gt;- Color, human-readable output by default; `--json` opts in.&lt;br/&gt;&lt;br/&gt;## Quartz&lt;br/&gt;&lt;br/&gt;- Adds NIP-AC — WebRTC call signaling events (offer / answer / ICE / hangup / reject / renegotiate) over EphemeralGiftWrap, multi-device, group calls&lt;br/&gt;- Adds EphemeralGiftWrapEvent (kind 21059) — replaces 20s expiration GiftWraps for call signaling&lt;br/&gt;- Adds NIP-A3 Payment Targets (kind 10133)&lt;br/&gt;- Adds NIP-82 Software Applications (experimental)&lt;br/&gt;- Adds the AdminCommandEvent for audio-room kick (kind 4312)&lt;br/&gt;- Adds the NIP-9A community rules parser &#43; validator (kind:34551)&lt;br/&gt;- Expands NIP-34 git collaboration coverage.&lt;br/&gt;  - Repository State (kind 30618).&lt;br/&gt;  - Pull Requests and PR updates (kinds 1618 / 1619).&lt;br/&gt;  - Git Status events (open / closed / draft / applied).&lt;br/&gt;- Adds the rest of NIP-51 list event kinds and full NIP-53 live-activity rendering&lt;br/&gt;- Adds MLS / Marmot event types and a pure-Kotlin MLS engine with IETF RFC 9420 interop test vectors (no native deps)&lt;br/&gt;- Adds an async SQLite event persistence layer.&lt;br/&gt;  - NIP-09 / NIP-50 / NIP-62 compliance.&lt;br/&gt;  - Room-style connection pool.&lt;br/&gt;- Adds a file-backed event store.&lt;br/&gt;  - flock &#43; transactions.&lt;br/&gt;  - scrub/compact.&lt;br/&gt;  - NIP-50 full-text search.&lt;br/&gt;  - NIP-62 Right-to-Vanish.&lt;br/&gt;  - NIP-01 tiebreaker.&lt;br/&gt;  - NIP-09 created_at window.&lt;br/&gt;  - Deletion-author check.&lt;br/&gt;- Adds a reactive `ObservableEventStore` layer.&lt;br/&gt;  - A façade that wraps any event store — SQLite-backed, file-backed, or in-memory.&lt;br/&gt;  - Publishes a `StoreChange` on every accepted insert, delete and expiration sweep.&lt;br/&gt;  - Projections stay in sync without re-querying the store.&lt;br/&gt;  - Ephemeral events (kinds 20000-29999) emit without being persisted.&lt;br/&gt;  - `EventStoreProjection` turns the change stream into a cold `Flow` of sealed `ProjectionState`.&lt;br/&gt;  - Per-filter limits and per-projection NIP-62 vanish scoping.&lt;br/&gt;- Promotes the relay toolkit into the new `geode` module — a real Nostr relay.&lt;br/&gt;  - Implements NIP-01 and NIP-45.&lt;br/&gt;  - NIP-77 negentropy reconciliation (strfry parity).&lt;br/&gt;  - NIP-86 management API.&lt;br/&gt;  - TOML config and graceful drain.&lt;br/&gt;  - Adaptive connection pooling for 10k&#43; connections.&lt;br/&gt;- Adds an EventInterner so deserialized events share canonical instances, with an interning event store that interns on insert&lt;br/&gt;- Adds Ktor KMP HTTP implementations alongside OkHttp&lt;br/&gt;- Adds macOS (Apple Silicon), iOS and Linux native targets.&lt;br/&gt;  - Pure-Kotlin Ed25519 and X25519 for the MLS crypto on those platforms.&lt;br/&gt;  - `commonMain` now compiles for Kotlin/Native.&lt;br/&gt;&lt;br/&gt;## Crypto and Performance&lt;br/&gt;&lt;br/&gt;- Custom secp256k1 implementation, starting to replace `fr.acinq.secp256k1`&lt;br/&gt;  - Pure-Kotlin core for KMP native targets (macOS / iOS / Linux).&lt;br/&gt;  - C &#43; inline-ASM accelerated path on Android via a JNI bridge.&lt;br/&gt;  - Hardware SHA-256 (SHA-NI on x86_64, ARMv8 CE on ARM64).&lt;br/&gt;  - Comb method for G multiplication → 3× faster sign/keygen.&lt;br/&gt;  - Same-pubkey batch Schnorr verify (5–6× throughput).&lt;br/&gt;  - `verifySchnorrFast` for Nostr (skips y-parity inversion).&lt;br/&gt;  - 4×64-bit limb representation with lazy field ops and ARM64 assembly.&lt;br/&gt;  - Standalone `libsecp256k1-nostr` / `libschnorr256k1` C project, with Android benchmarks.&lt;br/&gt;- Concurrent caching DNS resolver (SurgeDns)&lt;br/&gt;  - Lock-free DNS cache.&lt;br/&gt;  - 24h positive TTL.&lt;br/&gt;  - Stale-while-revalidate.&lt;br/&gt;  - Persisted across process restarts.&lt;br/&gt;- Smoother video playback&lt;br/&gt;  - Warm ExoPlayer pool and retained warm players.&lt;br/&gt;  - Tuned LoadControl.&lt;br/&gt;  - VideoCache warmup 10s → 1.5s.&lt;br/&gt;  - Stable controller-overlay tree.&lt;br/&gt;- Faster icons — shared FontFamily and TextMeasurer across all Material Symbols&lt;br/&gt;- Faster chat lists — stable list keys and reduced recomposition&lt;br/&gt;- Faster note rendering — cached event-derived values, fewer per-item allocations during feed scroll&lt;br/&gt;- Faster Quartz queries&lt;br/&gt;  - Direct-slot driver for replaceable &#43; addressable lookups.&lt;br/&gt;  - Streaming k-way merge.&lt;br/&gt;  - Smallest-first FTS intersect.&lt;br/&gt;  - Parallel Schnorr verify in the ingest queue.&lt;br/&gt;  - Index-driven fan-out for cache observers.&lt;br/&gt;- Faster rich-text translation&lt;br/&gt;- Thumbnail disk cache for profile pictures; Coil disk-cache eviction moved off the write path to prevent scroll stalls&lt;br/&gt;- Paginated GiftWrap loading for the DM chat list&lt;br/&gt;- Bookmark events preloaded for faster access&lt;br/&gt;- Lifecycle-aware screen subscriptions&lt;br/&gt;  - Feed/screen relay subscriptions pause on background and resume on foreground.&lt;br/&gt;  - 30s grace delay so brief app switches don&#39;t churn subscriptions.&lt;br/&gt;- Adaptive video disk cache — sized to 20% of free disk (256 MB–4 GB) instead of a fixed 1 GB, with on-demand HLS videos cached in SimpleCache&lt;br/&gt;- Tuned image/video OkHttp dispatcher and connection pool (16 in-flight per host) to de-serialize feed loading&lt;br/&gt;- Streaming image hashing — computes image hashes without loading the whole file into memory; SHA-256 hasher moved off the thread pool&lt;br/&gt;- GeoHash library rewritten from scratch for performance, dropping an external dependency&lt;br/&gt;&lt;br/&gt;## QUIC &#43; nestsClient (foundation)&lt;br/&gt;&lt;br/&gt;- New pure-Kotlin QUIC v1 &#43; HTTP/3 &#43; WebTransport client (no JNI, no native deps).&lt;br/&gt;  - Powers the NIP-53 audio-rooms over MoQ-transport path.&lt;br/&gt;- Full RFC coverage and stabilization:&lt;br/&gt;  - RFC 9002 loss recovery and retransmission.&lt;br/&gt;  - 0-RTT early data.&lt;br/&gt;  - 1-RTT key update.&lt;br/&gt;  - TLS 1.3 session resumption (PSK).&lt;br/&gt;  - ECN.&lt;br/&gt;  - Connection migration with path validation.&lt;br/&gt;  - Retry and Version Negotiation packet handling.&lt;br/&gt;  - Stateless-reset detection.&lt;br/&gt;  - Broad DoS-hardening / RFC-compliance stabilization sweep.&lt;br/&gt;- Passes the quic-interop-runner test matrix against picoquic and quic-go.&lt;br/&gt;  - Covers handshake, transfer, multiplexing, retry, 0-RTT, key-update, ECN, http3.&lt;br/&gt;  - Includes qlog diagnostics.&lt;br/&gt;- Multiple security and correctness audits.&lt;br/&gt;  - RFC 9001 test vectors.&lt;br/&gt;  - Live interop against aioquic and picoquic.&lt;br/&gt;- `nestsClient` module&lt;br/&gt;  - MoQ-transport (IETF) reference implementation.&lt;br/&gt;  - Production moq-lite Lite-03/04 codec with version-aware ALPN negotiation.&lt;br/&gt;  - `catalog.json` publishing aligned with kixelated/hang.&lt;br/&gt;  - Opus &#43; AudioRecord/AudioTrack.&lt;br/&gt;  - Reconnection policy with proactive JWT refresh.&lt;br/&gt;  - Cross-stack (Amethyst ↔ Rust ↔ browser) interop harness in CI.&lt;br/&gt;&lt;br/&gt;## Improvements and Fixes&lt;br/&gt;- WakeUp Push Notification events — Starting to migrate to a better Push/Loading system&lt;br/&gt;- Pinned notes moved to their own screen&lt;br/&gt;- Left drawer reorganized into collapsible You / Feeds / Create / System sections, with clearer names&lt;br/&gt;- Article writing redesign — banner, tags, slug&lt;br/&gt;- Redesigned long-form article cards&lt;br/&gt;- GIF support&lt;br/&gt;  - Playback controls and autoplay.&lt;br/&gt;  - GIF→MP4 upload conversion option in the upload screen.&lt;br/&gt;  - GIF / image keyboard support in the short post screen and in Marmot, DM and public-channel chat fields.&lt;br/&gt;- Configurable video player buttons in Account Settings&lt;br/&gt;- Autoplay Videos setting (Always / Never), separate from the video-loading toggle&lt;br/&gt;- Drag-and-drop reordering for some relay list settings&lt;br/&gt;- 3-dot options menu on video / picture / file feed cards&lt;br/&gt;- Zoomable media grows from its source bounds, and loads the full-resolution source in the image dialog&lt;br/&gt;- Favorite relays can now be added to the Global Feed&lt;br/&gt;- Configurable max-hashtag spam filter&lt;br/&gt;- Account setting to forward kind 0 events to a local relay&lt;br/&gt;- Relay Sync UI replaced with visual indicators&lt;br/&gt;- Account Settings&lt;br/&gt;  - Split broadcast tracker visibility from Complete UI mode.&lt;br/&gt;  - Hide payment-targets icon by default and place it after Zap.&lt;br/&gt;  - Float the broadcast banner as a rounded card.&lt;br/&gt;- Danger Zone section in settings&lt;br/&gt;- NIP-89 client tag&lt;br/&gt;  - Per-account toggle to disable it, synced via NIP-78 security settings.&lt;br/&gt;  - On by default and moved into Compose settings.&lt;br/&gt;- Local Blossom cache — image and profile-picture fetches route through a local Blossom cache&lt;br/&gt;- Mention preservation in compose:&lt;br/&gt;  - Survives keyboard auto-correction.&lt;br/&gt;  - Partial-overlap edits delete the whole mention.&lt;br/&gt;  - Cursor snaps to mention boundaries.&lt;br/&gt;- Chat cursor jumping fixed&lt;br/&gt;- Avatar zoom-in keeps aspect ratio during the animation&lt;br/&gt;- Profile pictures center-cropped to prevent squashing&lt;br/&gt;- HLS video fixes:&lt;br/&gt;  - Playback routed to the right MediaSource.&lt;br/&gt;  - Multi-rendition videos collapse to a single gallery tile.&lt;br/&gt;  - Render with artwork and a graceful fallback.&lt;br/&gt;- Broken &#34;Pause&#34; action removed from the always-on background notification&lt;br/&gt;- Hand-raise button in audio rooms now has a visible toggled state&lt;br/&gt;- GiftWrap unwrapping for all writable accounts when always-on is enabled&lt;br/&gt;- Search bar bech32 paste navigates instead of running a search&lt;br/&gt;- Top and bottom bars stay visible on non-scrollable lists&lt;br/&gt;- Rich-text translation:&lt;br/&gt;  - Bug, performance and jitter overhaul.&lt;br/&gt;  - `{N}` placeholders so URLs survive CJK translation.&lt;br/&gt;- Swipe-to-dismiss containers fixed on newer Compose&lt;br/&gt;- Right-to-Vanish settings observe toggles reactively, preserve prior behavior on upgrade&lt;br/&gt;- Relay reconnection:&lt;br/&gt;  - Auto-reconnect after a server-initiated disconnect.&lt;br/&gt;  - Periodic keep-alive to revive relays stuck in long backoff.&lt;br/&gt;- Account settings (profile, follow list, mutes, relay lists, KeyPackages) are republished to newly-selected relays so accounts aren&#39;t lost on fresh relays&lt;br/&gt;- Broadcasting relays:&lt;br/&gt;  - Kept out of personal &amp; channel sends.&lt;br/&gt;  - Always included in non-private sends.&lt;br/&gt;  - Fixed an infinite loop in the broadcast-relay computation.&lt;br/&gt;- Tor now falls back to clearnet when bootstrap is stuck&lt;br/&gt;- Android Arti reliability: stale Arti cache cleared on init with retry, SOCKS proxy default port moved with busy-port retry, relay-over-Tor connectivity fixes&lt;br/&gt;- Chess game challenges filtered out of the home feed (ended games only); chess cards show user picture and name instead of hex pubkeys&lt;br/&gt;- Expired polls re-evaluated and removed from notification cards&lt;br/&gt;- NIP-39 external identity claims without a platform separator are rejected&lt;br/&gt;- Dismissible cleanup banner across Pinned Notes, Bookmarks and Bookmark Sets, flagging author-deleted items with a &#34;Remove from list&#34; action&lt;br/&gt;- Bogus Content-Type rejected when saving downloaded media, with URL-extension fallback validation&lt;br/&gt;- NIP-46 bunker decrypt/encrypt response parsing fixed, with a longer timeout&lt;br/&gt;- Hidden DMs no longer counted toward the unread message badge&lt;br/&gt;- Profile header hides the `_@` prefix on NIP-05 names&lt;br/&gt;- Foreground-service-not-allowed exception from the background handled gracefully&lt;br/&gt;- Fixes Samsung crash on outgoing call&lt;br/&gt;- Foreground service starts earlier to prevent call death on Android 14&#43;&lt;br/&gt;- Stop ringtone and call notification when rejecting consecutive calls&lt;br/&gt;&lt;br/&gt;## UI Refresh&lt;br/&gt;&lt;br/&gt;- Migrates the icon set from Material Icons to Material Symbols (thin weight) for a more consistent, modern look across the app&lt;br/&gt;- Drops unused legacy drawables&lt;br/&gt;- Bottom-bar icon size bumped to compensate for Material Symbols padding&lt;br/&gt;&lt;br/&gt;## Build &amp; Documentation&lt;br/&gt;&lt;br/&gt;- CI restructure:&lt;br/&gt;  - Splits Android into its own CI job.&lt;br/&gt;  - Adds Android Lint as the first step.&lt;br/&gt;  - Merges test&#43;build to eliminate duplicate compilation.&lt;br/&gt;  - Drops `assembleDebug` APK uploads.&lt;br/&gt;- Adds a `:nestsClient:test` step to the desktop CI leg&lt;br/&gt;- Adds a quic-interop-runner CI workflow and a browser-side cross-stack interop workflow&lt;br/&gt;- Broadens `libicu` Depends so the `.deb` installs across Debian and Ubuntu&lt;br/&gt;- Adds `SECURITY.md` with private vulnerability reporting policy&lt;br/&gt;- Moves desktop packaging / AppImage tooling into the `desktopApp` module&lt;br/&gt;- AGP and dependencies bumped&lt;br/&gt;&lt;br/&gt;## Contributors&lt;br/&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsyvrp9u6p0mfur9dfdru3d853tx9mdjuhkphxuxgfwmryja7zsvhqpzamhxue69uhhv6t5daezumn0wd68yvfwvdhk6tcpzpmhxue69uhkummnw3ezumt0d5hszythwden5te0dehhxarj9emkjmn99uwfvhl6&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;VitorPamplona&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…vhl6&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;⚡ Dee Kay ⚡&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…m3sx&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs9vyevafl4f7rqluqykt500e9nj5ase8eh5k423rgwtfw6qdjhd4spz4mhxue69uhhyetvv9ujuerpd46hxtnfduhsz9mhwden5te0wfjkccte9ehx7um5wghxyctwvshszrnhwden5te0dehhxtnvdakz7axwpzp&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;beefenergy&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…wpzp&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs827g8dkd07zjvlhh60csytujgd3l9mz7x807xk3fewge7rwlukxgppemhxue69uhkummn9ekx7mp0qydhwumn8ghj7argv4nx7un9wd6zumn0wd68yvfwvdhk6tcpz9mhxue69uhkummnw3ezumrpdejz7d9xcpk&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;greenart7c3&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…xcpk&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqswc4nrhvp4lrjct0ayy0ps8f2hvj8e2guucp63dwcx6m6e8pka9fqpr4mhxue69uhkummnw3ezucnfw33k76twv4ezuum0vd5kzmp0qy08wumn8ghj7un9d3shjtnwdaehgu3wwa5hyetydejhgtn2wqhsz9nhwden5te0v4jx2m3wdehhxarj9ekxzmny9ue5n65v&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;KotlinGeek&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…n65v&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsxeh4ue276rhaqtz4c2df209gfkkft9006qdcryh3gaswtfuvxvlgpzamhxue69uhhyetvv9ujuurjd9kkzmpwdejhgtcpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhsz9mhwden5te0wfjkccte9en82mnywd68ytndv5hsc2mjk6&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;v&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…mjk6&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;## Translations&lt;br/&gt;&lt;br/&gt;- Czech, German, Swedish, and Portuguese by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsv4zwtz8cuwh2mvc3zdrl5853g365t9j6mn25edlul7uz0eyzt0zcpzpmhxue69uhkummnw3ezumt0d5hszxnhwden5te0wf5kymewv46jumn0wd68y6tp9eshqup0qyd8wumn8ghj7um9dejxjapwdehhxenvv9ex2tnrdakj7nrm3sx&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;⚡ Dee Kay ⚡&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…m3sx&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Hungarian by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsxekg0s8kxpcrka8ccwztv2m73kz6jy0ur8f7jc04rwr5p44w5acspzamhxue69uhhyetvv9ujumn0wd68ytnzv9hxgtcppemhxue69uhkummn9ekx7mp0qyg8wumn8ghj7mn0wd68ytnddakj7c0ns2l&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;summoner&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…ns2l&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- French by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs8av5uzf4nv2q80chrmp3mj9a9dd6zjw4fmz56hsn2gzar72rxhtcppemhxue69uhkummn9ekx7mp0qyg8wumn8ghj7mn0wd68ytnddakj7qgawaehxw309ahx7um5wghxy6t5vdhkjmn9wgh8xmmrd9skctcuvd26f&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;DuPainEtDesJeux&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…d26f&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Polish by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsdyfz0ewdhmgp3a4r3pxvezx5r8yalrgvjn38v2ml5qrusnv7yywgpzemhxue69uhkummnw3ezucm6v9ejuurvw4ej7qg0waehxw309a3h5ctn9e6x7up0kvajyt&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Polak&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…ajyt&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Hindi by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs88dt78wgnzvaph6fcstfvsd98xc2qs8eg8tllwv2zlutu8ehec2cpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhszrnhwden5te0dehhxtnvdakz7qghwaehxw309aex2mrp0yh8qunfd4skctnwv46z7x03hlx&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;राज&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…3hlx&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Slovenian by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsqqqqqqp0fmkspg7w8d305ln96a0jw0ptwqtuwskkm5pddv2kkjfcppemhxue69uhkummn9ekx7mp0qy2hwumn8ghj7un9d3shjtnyv9kh2uewd9hj7qgkwaehxw309aex2mrp0yhxg6t5w3hjuur4vghsdu406e&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;StellarStoic&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…406e&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Bengali by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsgs9hgjw87vz36jf2r83m5zree2q87zvs8s7kty9jljdz7wprytyspremhxue69uhkummnw3ezu6m0de5kueedv3jkwunpv9nzumnv9uq3kamnwvaz7tm5d4cz6un9d3shjtnrv4ekxtn5wfskgef0qy28wumn8ghj7mn0wd68yt3k8quzummjvuhsg63aw2&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Cats&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…3aw2&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Spanish by &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqs07tjpyvvlq9ugdpax8h3jfrpwn7kr72k3tc7ky83tggn4et9eangpg3mhxw309ajxyartwdukjery09cxwctsd3ek6cnjdfnxs6t00pnhq7ttdvmkw7nsd3shxdrr0gery6nyva3h2ct0096kyerjw9jzummwd9hkutcprpmhxue69uhkv6tvw3jhytnwdaehgu3wwa5kuef0qyghwumn8ghj7mn0wd68ytnhd9hx2tcxdyhdq&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;⚡₿it₿y₿it⚡&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…yhdq&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Chinese by hypnotichemionus4 and &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/nprofile1qqsyxnuhnymz0u0xru2watmqe25vlh8vzzje9jhlsfgvsff9942gc9gprfmhxue69uhhq7tjv9kkjepwve5kzar2v9nzucm0d5hsz9mhwden5te0wfjkccte9e3hsurvv9ujummjvuhsz9nhwden5te0wfjkccte9ehx7um5wghx6mm99urkr68m&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;CXPLAY&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;nprofile…r68m&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;&lt;br/&gt;- Russian by Anton Zhao &lt;/blockquote&gt;
    </content>
    <updated>2026-05-15T20:50:30Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs0ss5zdeunrlldddddwvdsrr306hctkeaz65at6vrt9mh5dl73l4czyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032t358hn</id>
    
      <title type="html">Интересные исследования ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs0ss5zdeunrlldddddwvdsrr306hctkeaz65at6vrt9mh5dl73l4czyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032t358hn" />
    <content type="html">
      Интересные исследования шифрования whatsapp через реверс-инженеринг &#43; аудит trail of bits. По сути, сквозное шифрование сообщений и прямую секретность доказать удалось, чтоб там павел дыров не кричал. Конечно, статьи нашли достаточно уязвимых мест, в основном, для метаданных, и отклонений от протокола signal (цукерберг тоже врун), но это всё равно лучше, чем облачные переписки в телеге, особенно, в групповых чатах.&lt;br/&gt;&lt;br/&gt;1. &lt;a href=&#34;https://eprint.iacr.org/2025/794.pdf&#34;&gt;https://eprint.iacr.org/2025/794.pdf&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;2. &lt;a href=&#34;https://arxiv.org/html/2511.11385v2&#34;&gt;https://arxiv.org/html/2511.11385v2&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;3. &lt;a href=&#34;https://blog.trailofbits.com/2026/04/07/what-we-learned-about-tee-security-from-auditing-whatsapps-private-inference/&#34;&gt;https://blog.trailofbits.com/2026/04/07/what-we-learned-about-tee-security-from-auditing-whatsapps-private-inference/&lt;/a&gt; 
    </content>
    <updated>2026-05-15T15:09:14Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvhm8lez75j0enw66nyzxh8y265vxwjx8jyl87z6f6ldmss4dk2dszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032cy7k50</id>
    
      <title type="html">@npub1utx…50e8 hello! add a private following - private contact ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvhm8lez75j0enw66nyzxh8y265vxwjx8jyl87z6f6ldmss4dk2dszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032cy7k50" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1utx00neqgqln72j22kej3ux7803c2k986henvvha4thuwfkper4s7r50e8&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;utxo the webmaster 🧑‍💻🍁&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1utx…50e8&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  hello! add a private following - private contact list with hidden subs, like in Amethyst and 0xchat. many users will not see all the following list on Wisp after Amethyst and 0xchat. and please add a PIN code that encrypts the database.  &lt;img src=&#34;https://media.libernet.app/s/yhmR0P.jpg&#34;&gt; 
    </content>
    <updated>2026-05-14T04:47:57Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsg8uznf0feez2kg0uyu0zmgv289f7z45r9hdm3dtyf55dlzhkaeyqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032jk0dqy</id>
    
      <title type="html">&amp;#34;шифрование&amp;#34; винды - это цирк с ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsg8uznf0feez2kg0uyu0zmgv289f7z45r9hdm3dtyf55dlzhkaeyqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032jk0dqy" />
    <content type="html">
      &amp;#34;шифрование&amp;#34; винды - это цирк с блэкджеком и бэкдорами&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://cybernews.com/security/researcher-releases-bitlocker-bypass-and-privilege-escalation-exploit/&#34;&gt;https://cybernews.com/security/researcher-releases-bitlocker-bypass-and-privilege-escalation-exploit/&lt;/a&gt; 
    </content>
    <updated>2026-05-13T15:23:09Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsg0rzamal70a487azue2shjgy62cqgah28s97qge6ap4x8k49u4cqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630322akhe8</id>
    
      <title type="html">Крутой инструмент обхода белых ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsg0rzamal70a487azue2shjgy62cqgah28s97qge6ap4x8k49u4cqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630322akhe8" />
    <content type="html">
      Крутой инструмент обхода белых списков на базе белых звонков/стримингов&lt;br/&gt;&lt;a href=&#34;https://github.com/openlibrecommunity/olcrtc&#34;&gt;https://github.com/openlibrecommunity/olcrtc&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;И подробные инструкции как это запустить самому&lt;br/&gt;&lt;a href=&#34;https://habr.com/ru/articles/1020114/&#34;&gt;https://habr.com/ru/articles/1020114/&lt;/a&gt;&lt;br/&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=kxv7ET2cV1U&#34;&gt;https://www.youtube.com/watch?v=kxv7ET2cV1U&lt;/a&gt; 
    </content>
    <updated>2026-05-08T11:52:37Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsgycm8pddqdkkkfnckhjk8tflclwkaexfpelz05ujh9edrhm37d0gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032400z33</id>
    
      <title type="html">юзерам из рф особый поклон #note1wvu…8952</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsgycm8pddqdkkkfnckhjk8tflclwkaexfpelz05ujh9edrhm37d0gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032400z33" />
    <content type="html">
      юзерам из рф особый поклон &lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/note1wvu3g4zcdpzz8576v3ctufqcz06ljwnarqee2c922ensqeycampsww8952&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;note1wvu…8952&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; Completely refactored the real-time Geohash Explorer on #Nymchat to be way more performant as a 2D flat world map and show country borders and names as well as have an optional heat map, shown below:&lt;br/&gt;&lt;br/&gt; &lt;img src=&#34;https://file.nostrmedia.com/p/d49a9023a21dba1b3c8306ca369bf3243d8b44b8f0b6d1196607f7b0990fa8df/39ea981670d1d7720644f34f1b6c71c239243fa13552ef4c51646f179b00f551.png&#34;&gt;   &lt;img src=&#34;https://file.nostrmedia.com/p/d49a9023a21dba1b3c8306ca369bf3243d8b44b8f0b6d1196607f7b0990fa8df/efd0a6d89b6b5f2176566c004c7c2eca99c10d9192018834a2f8969e251939f8.png&#34;&gt; &lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://nymchat.app&#34;&gt;https://nymchat.app&lt;/a&gt; &lt;/blockquote&gt;
    </content>
    <updated>2026-05-07T08:53:26Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsycexzd6cdctc64pk0rm82fzr70l8v5ge8txdakyz80t9gwhv25fszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ps0e2c</id>
    
      <title type="html">Amethyst, Wisp and 0xchat</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsycexzd6cdctc64pk0rm82fzr70l8v5ge8txdakyz80t9gwhv25fszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ps0e2c" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqs22jtj48kt0menedqt4qeqajyvgv0v7vm48vuj3x5qwqdcq9vkzac49w4as&#39;&gt;nevent1q…w4as&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Amethyst, Wisp and 0xchat 
    </content>
    <updated>2026-05-06T21:16:29Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvxmvajtn8q4lyj5q2tstzsf86jcjdrr5umw92tuqtqwzjgq7fn5szyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630324rjf7y</id>
    
      <title type="html">Nospeak added support for audio and video calls! very cool secure ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvxmvajtn8q4lyj5q2tstzsf86jcjdrr5umw92tuqtqwzjgq7fn5szyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630324rjf7y" />
    <content type="html">
      Nospeak added support for audio and video calls! very cool secure nostr messenger.&lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub174t832slt4252dk526cnh64sfa3k6claah2cdl3c5n9eeeyvjz7q2fmqm6&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;psic4t&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub174t…mqm6&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  thanks! what&amp;#39;s next? notes? marmot chats?&lt;br/&gt;&lt;br/&gt;Nospeak теперь один из лучших и стабильно работающих мессенджеров #nostr&lt;br/&gt;&lt;a href=&#34;https://github.com/psic4t/nospeak&#34;&gt;https://github.com/psic4t/nospeak&lt;/a&gt; 
    </content>
    <updated>2026-05-03T05:03:45Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8jyq6qy2qwx3e28ap5lcn03mw4vw776jzvm4rymxjr9wytj5v3kszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032rmylgd</id>
    
      <title type="html">Simplex Chat добавил функцию каналов. ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8jyq6qy2qwx3e28ap5lcn03mw4vw776jzvm4rymxjr9wytj5v3kszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032rmylgd" />
    <content type="html">
      Simplex Chat добавил функцию каналов. Каналы реализованы по похожей на Nostr модели - передача контента пойдет через реле с сохранением состояния, при этом, реле не имеют никакой инфы о владельцах или пользователях канала, а контент зашифрован криптографией. Админы каналов полностью владеют клачами и контентом - никаких банов, как в телеге у Дырова нет &#43; полная анонимность участников. Вот что значит - делать с заботов о людях и их приватности. Учись Пашка и не рассказывай сказки о приватности в своей дырявой помойке.&lt;br/&gt;&lt;a href=&#34;https://github.com/simplex-chat/simplex-chat/blob/master/docs/protocol/channels-overview.md&#34;&gt;https://github.com/simplex-chat/simplex-chat/blob/master/docs/protocol/channels-overview.md&lt;/a&gt; 
    </content>
    <updated>2026-05-01T14:44:18Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqszr9nxhfkceq06z3syyh7vhnmyruaepmnjlyr5q6rp56zc657kysszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032d7gwhs</id>
    
      <title type="html">Выявление слежки в 30 популярных ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqszr9nxhfkceq06z3syyh7vhnmyruaepmnjlyr5q6rp56zc657kysszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032d7gwhs" />
    <content type="html">
      Выявление слежки в 30 популярных российских приложениях&lt;br/&gt;&lt;a href=&#34;https://rks.global/files/research/russian_apps_search_for_vpn_ru.pdf&#34;&gt;https://rks.global/files/research/russian_apps_search_for_vpn_ru.pdf&lt;/a&gt; 
    </content>
    <updated>2026-05-01T08:12:09Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs9k5gmssq6ap93vxhahug58kzftaqgjh94t6qg67veqrsh02g4tygzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032dn8kyh</id>
    
      <title type="html">Cloudflare пометил макс, как шпионское ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs9k5gmssq6ap93vxhahug58kzftaqgjh94t6qg67veqrsh02g4tygzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032dn8kyh" />
    <content type="html">
      Cloudflare пометил макс, как шпионское ПО. В идеале, как минимум, так надо пометить еще и яндекс с вк/ок, но до этих у Cloudflare, наверно, руки не дойдут  &lt;img src=&#34;https://media.libernet.app/s/THqFrf.jpg&#34;&gt; 
    </content>
    <updated>2026-04-30T11:47:26Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsqsy4wjn4ehxw992xukdqskr0gxpc0h45g52dn2z6we05vvs28nzqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630327n9zz4</id>
    
      <title type="html">Cool! Warp is now open-source! ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsqsy4wjn4ehxw992xukdqskr0gxpc0h45g52dn2z6we05vvs28nzqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630327n9zz4" />
    <content type="html">
      Cool! Warp is now open-source!&lt;br/&gt;&lt;a href=&#34;https://www.warp.dev/blog/warp-is-now-open-source&#34;&gt;https://www.warp.dev/blog/warp-is-now-open-source&lt;/a&gt; 
    </content>
    <updated>2026-04-29T06:14:13Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsdzzrn2qm6gh5zexlxntmmha5q9nwdmkqv6j4ef6h7fjlj2srlszqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630325h837g</id>
    
      <title type="html">Delta Chat может работать в белых ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsdzzrn2qm6gh5zexlxntmmha5q9nwdmkqv6j4ef6h7fjlj2srlszqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630325h837g" />
    <content type="html">
      Delta Chat может работать в белых списках. Вот что для этого нужно:&lt;br/&gt;&lt;br/&gt;Подготовка «транспорта»: Не используйте свой личный ящик, иначе Delta Chat смешает ваши почтовые письма с чатами. Зарегистрируйте новый чистый аккаунт, например, на яндекс почте или на вк почте.&lt;br/&gt;&lt;br/&gt;Разрешение доступа (Критический шаг): Современные почтовые сервисы запрещают подключение по IMAP с основным паролем от аккаунта в целях безопасности. Вам нужно создать Пароль приложения.&lt;br/&gt;&lt;br/&gt;В Яндексе: Зайдите в аккаунт -&amp;gt; Безопасность -&amp;gt; Пароли приложений. Создайте новый пароль (выберите тип “Почта”). Скопируйте сгенерированный 16-значный код. Убедитесь, что в настройках почтового ящика (Почтовые программы) включен доступ по IMAP.&lt;br/&gt;&lt;br/&gt;В VK Почте: Перейдите в настройки безопасности аккаунта VK ID -&amp;gt; Безопасность и вход -&amp;gt; Пароли для внешних приложений. Сгенерируйте пароль.&lt;br/&gt;&lt;br/&gt;Установка и первый запуск: Скачайте клиент Delta Chat. Приложения доступны для Android, iOS, Windows, macOS и Linux. При запуске выберите «Войти в свой аккаунт». Запустите приложение и выберите &amp;#34;Использовать электронную почту как релей&amp;#34;. Введите ваш созданный e-mail и вставьте пароль приложения. Приложение автоматически подтянет настройки серверов Яндекса или VK.&lt;br/&gt;&lt;br/&gt;Крутая настройка для усиления приватности перед почтовым провайдером: Зайдите в Настройки Delta Chat -&amp;gt; Продвинутые настройки. Опционально можно включить скрытие заголовков Message-ID и Chat-Version, чтобы ваши письма даже для почтовых алгоритмов Яндекса выглядели максимально стандартно, без следов автоматизации мессенджером.&lt;br/&gt;&lt;br/&gt;В Delta Chat через ботов можно читать крупные публичные телеграм каналы и rss-ленты. В итоге, получится телеграм на минималках, но зато с шифрованием. Список публичных ботов Delta Chat:&lt;br/&gt;&lt;a href=&#34;https://deltachat-bot.github.io/public-bots/#/home&#34;&gt;https://deltachat-bot.github.io/public-bots/#/home&lt;/a&gt; 
    </content>
    <updated>2026-04-27T06:41:52Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2zl937wxrump05eprl7kx0fec9dxk5r5ff08rqn3fu02a4ck6unqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032lp3pp0</id>
    
      <title type="html">@npub16zx…4ynp please add a PIN code and local database ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2zl937wxrump05eprl7kx0fec9dxk5r5ff08rqn3fu02a4ck6unqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032lp3pp0" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub16zxpwcght62n7q4j88uj6ynehdqfzk572rues3y2tshr0vehfwjq2v4ynp&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Delta Chat&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub16zx…4ynp&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  please add a PIN code and local database encryption to the mobile and desktop clients 
    </content>
    <updated>2026-04-25T11:26:09Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8jkkmjxw80uwrjrezx7n45wpkzh3qkulkumja3xmhjfjjr57xekszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032at36gt</id>
    
      <title type="html">@npub1hru…f3yh chats nip-17 and marmot are very good👍 add a ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8jkkmjxw80uwrjrezx7n45wpkzh3qkulkumja3xmhjfjjr57xekszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032at36gt" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1hrujuc08r4zcdtn0u6ts7u7apldcjqgftz0z7stmaaz9hwaf9jxs66f3yh&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;VectorPrivacy&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1hru…f3yh&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  chats nip-17 and marmot are very good👍&lt;br/&gt;add a multi-account and maybe nostr web apps for viewing news and notes. also need a function to hide messages in notifications. &lt;br/&gt; 
    </content>
    <updated>2026-04-24T17:34:51Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs8w0hw3swxz7g7dmh2wt5hg4kk9nns2s03hrtx6nu9erk6uva0f6czyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032m3cht8</id>
    
      <title type="html">@npub180c…h6w6 Hello. Are Nostr messages using NIP-17, NIP-EE, ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs8w0hw3swxz7g7dmh2wt5hg4kk9nns2s03hrtx6nu9erk6uva0f6czyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032m3cht8" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;fiatjaf&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub180c…h6w6&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  Hello. Are Nostr messages using NIP-17, NIP-EE, or Marmot protected against extraction from the device or forensic analysis (including deleted messages)? Can intelligence agencies and police recover data after the application has been uninstalled? 
    </content>
    <updated>2026-04-24T09:43:40Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsgmsswuj0dengl5v3a594tehv26dey2avec7gdg554ztasrlpkksgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032g58tq0</id>
    
      <title type="html">Hello! You have a wonderful app! The browser works really great. ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsgmsswuj0dengl5v3a594tehv26dey2avec7gdg554ztasrlpkksgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032g58tq0" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqswe62nwppdsmmzqrxzfqpzc2k9e2tsxaznjn0sd86wzlxy3p6gatscjas7e&#39;&gt;nevent1q…as7e&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Hello! You have a wonderful app! The browser works really great. But I noticed some issues with chats: it&amp;#39;s impossible to have one Signal chat synced between phone and desktop. Also, messages disappear in the NIP-17 chat when using the account on both phone and desktop simultaneously. I tested this on Debian 13 and Android 16. Also, why is there a separate chat for my NIP-17 messages and notifications from there? (Maybe allow muting notifications for individual chats?). It would be cool if the app had a single unified chat on both phone and desktop, syncing all messages for both NIP-17 and Signal. 
    </content>
    <updated>2026-04-24T09:06:21Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsdqcfvzts5wnlhth33wn6k0f5ja5x93se208dpkx8jkygweht8wwgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630320c3s6c</id>
    
      <title type="html">@npub1wht…r3ec @npub1h0u…rwx8 White Noise and Keychat not ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsdqcfvzts5wnlhth33wn6k0f5ja5x93se208dpkx8jkygweht8wwgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630320c3s6c" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1whtn0s68y3cs98zysa4nxrfzss5g5snhndv35tk5m2sudsr7ltms48r3ec&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;White Noise&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1wht…r3ec&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1h0uj825jgcr9lzxyp37ehasuenq070707pj63je07n8mkcsg3u0qnsrwx8&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Keychat&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1h0u…rwx8&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  White Noise and Keychat not compatible now? (different encryption protocols?)&lt;br/&gt;#nostr #signal #mls 
    </content>
    <updated>2026-04-20T06:15:05Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsza82szyl2e4hvckfue5hgw5dd8kcpaeafagx9lyrcf5nf72r8d8szyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032knr7xa</id>
    
      <title type="html">https://github.com/ExTV/Podroid Запуск ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsza82szyl2e4hvckfue5hgw5dd8kcpaeafagx9lyrcf5nf72r8d8szyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032knr7xa" />
    <content type="html">
      &lt;a href=&#34;https://github.com/ExTV/Podroid&#34;&gt;https://github.com/ExTV/Podroid&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Запуск Linux-контейнеров на Android без root-прав. Podroid позволяет пользователю запускать на устройстве под управлением Android (Android 9&#43; arm64) облегчённую виртуальную машину Alpine Linux с использованием QEMU. 
    </content>
    <updated>2026-04-19T05:17:30Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrm0uxtnk5yx3ldtkw4jvwuqd0frfr93kr6889yzdk4rzaq7lwpfszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303202kn6x</id>
    
      <title type="html">Tor начал разрабатывать собственные ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrm0uxtnk5yx3ldtkw4jvwuqd0frfr93kr6889yzdk4rzaq7lwpfszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w6303202kn6x" />
    <content type="html">
      Tor начал разрабатывать собственные ram-серверы, уничтожающие все данные при изъятии. Мощная защита от криминалистики.&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://www.techradar.com/vpn/vpn-privacy-security/beyond-no-log-tor-looks-into-seizure-proof-servers-that-forget-your-data&#34;&gt;https://www.techradar.com/vpn/vpn-privacy-security/beyond-no-log-tor-looks-into-seizure-proof-servers-that-forget-your-data&lt;/a&gt; 
    </content>
    <updated>2026-04-18T07:22:36Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsyxaxmexnklqay94gka0suq9v93d8upsl80qu4lsder80cxswuzvszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032hdax6l</id>
    
      <title type="html">Sorry, I found how to delete cookies. Cool!</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsyxaxmexnklqay94gka0suq9v93d8upsl80qu4lsder80cxswuzvszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032hdax6l" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsrn7uhkrjpwl0nvfmx22h704vwrwwujzxpg8m53vl2pp3agh4thvq9zm24w&#39;&gt;nevent1q…m24w&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Sorry, I found how to delete cookies. Cool! 
    </content>
    <updated>2026-04-17T05:22:45Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrn7uhkrjpwl0nvfmx22h704vwrwwujzxpg8m53vl2pp3agh4thvqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ekefmn</id>
    
      <title type="html">@npub1h0u…rwx8 hello! you are amazing! please add deleting ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrn7uhkrjpwl0nvfmx22h704vwrwwujzxpg8m53vl2pp3agh4thvqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032ekefmn" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1h0uj825jgcr9lzxyp37ehasuenq070707pj63je07n8mkcsg3u0qnsrwx8&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Keychat&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1h0u…rwx8&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  hello! you are amazing! please add deleting cookies in your browser. and I don&amp;#39;t receive messages in nip-17 - I get a new message notification, but there is no message. check it please. &lt;br/&gt;mls chats work great! and Keychat works great on Linux! 
    </content>
    <updated>2026-04-17T04:46:43Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs0f4zxs5gtwz4dwdvmuktmpsetn3rzge5edrzuezvl43gc87f230gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032tk0pns</id>
    
      <title type="html">@npub17n4…fyh9 thanks for dm! please add support of private ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs0f4zxs5gtwz4dwdvmuktmpsetn3rzge5edrzuezvl43gc87f230gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032tk0pns" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub17n4cuc4d6y6qh89dekvxrenfkt5s0n49xns00uavjaxpr36c55dq87fyh9&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;Jumble&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub17n4…fyh9&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  thanks for dm! please add support of private following / private contacts (secret subscriptions that no one sees, like contacts in 0xchat and dm-contacts in Amethyst). 
    </content>
    <updated>2026-04-16T06:34:29Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs0tac5lfqee6sg7s73pezky2c8kach3qkly957gq07wh257e7an5qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032etv04z</id>
    
      <title type="html">Jumble added DM with signal mls encryption. The first Nostr web ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs0tac5lfqee6sg7s73pezky2c8kach3qkly957gq07wh257e7an5qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032etv04z" />
    <content type="html">
      Jumble added DM with signal mls encryption. The first Nostr web client with the most powerful encryption. Now you can use mls encryption in 0xchat in Jumble (napps).&lt;br/&gt;&lt;br/&gt;Джамбл добавил личку с супер-шифрованием сигнала - теперь у нас есть и вэб-клиент ностр с мощнейшим шифрованием. В 0хchat можно совмещать шифрование с nip-17 (в лс 0х) &#43; млс-шифрование в джамбл (в napps).&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://jumble.social/&#34;&gt;https://jumble.social/&lt;/a&gt; 
    </content>
    <updated>2026-04-16T06:21:36Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsz30a4f7krjenx4mhk8u8uj3m4ydmzvx0a3skl7dprzjpm7ntd9dczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032kj55k8</id>
    
      <title type="html">wow okay 😂</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsz30a4f7krjenx4mhk8u8uj3m4ydmzvx0a3skl7dprzjpm7ntd9dczyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032kj55k8" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsquhut73af8hh4mryqlzppzpzuksccmga6mnu8xg58dueytepnzkqxvk559&#39;&gt;nevent1q…k559&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;wow okay 😂 
    </content>
    <updated>2026-04-15T11:33:22Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsfp45ag3u6rk0z55ad7udz5h243dw2q40zwhsvsj32fkp4v3fccnszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032p5x98h</id>
    
      <title type="html">@npub1gcx…nj5z add ntfy support for notifications. amethyst has ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsfp45ag3u6rk0z55ad7udz5h243dw2q40zwhsvsj32fkp4v3fccnszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032p5x98h" />
    <content type="html">
      &lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Person&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;&lt;span&gt;VitorPamplona&lt;/span&gt; (&lt;span class=&#34;italic&#34;&gt;npub1gcx…nj5z&lt;/span&gt;)&lt;/a&gt;&lt;/span&gt;  add ntfy support for notifications. amethyst has no notification in graphene os 
    </content>
    <updated>2026-04-15T04:06:20Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqstlc470ehfzuspugadsr4tewhauz50cu9qahpx0td6tmm9e7j9u8gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032s3jpmy</id>
    
      <title type="html">FBI Extracts Suspect’s Deleted Signal Messages Saved in iPhone ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqstlc470ehfzuspugadsr4tewhauz50cu9qahpx0td6tmm9e7j9u8gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032s3jpmy" />
    <content type="html">
      FBI Extracts Suspect’s Deleted Signal Messages Saved in iPhone Notification Database. &lt;br/&gt;Вот почему криминалистическая экспертиза - вещь серьезная, и от нее надо мощно защищаться (лучше всего, с Graphene OS)&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://lifehacker.com/tech/fbi-extracted-deleted-signal-messages-from-a-defendants-iphone&#34;&gt;https://lifehacker.com/tech/fbi-extracted-deleted-signal-messages-from-a-defendants-iphone&lt;/a&gt; 
    </content>
    <updated>2026-04-10T07:32:29Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsrvn3ewmu4nnf235dkhfxa9cgjgzg29j26kxsm88hmet9gwmahllszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032hcwa33</id>
    
      <title type="html">Cloudflare признал Telega шпионским ПО ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsrvn3ewmu4nnf235dkhfxa9cgjgzg29j26kxsm88hmet9gwmahllszyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032hcwa33" />
    <content type="html">
      Cloudflare признал Telega шпионским ПО&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://kod.ru/cloudflare-vs-telega&#34;&gt;https://kod.ru/cloudflare-vs-telega&lt;/a&gt; 
    </content>
    <updated>2026-04-09T11:34:18Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsq26lp6ptls9mvhqjlx8xenhud3pvgnxj0l47qktpxwdfwz3gw0eqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032mjcsjg</id>
    
      <title type="html">ну и третий спасительный вариант - ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsq26lp6ptls9mvhqjlx8xenhud3pvgnxj0l47qktpxwdfwz3gw0eqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032mjcsjg" />
    <content type="html">
      ну и третий спасительный вариант - использовать graphene os и расскидать вк-яндексы и ютубы-инстаграмы в разные профили. &lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/note1segkzcwur68v8j8w8arxdmgw8fgkvrjzky8m5x9q5ey67hzkhh2stw3wn2&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;note1seg…3wn2&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; На гитхабе появились приложения для андроид с проверкой обнаружения впн на устройстве. Реализовано всё это по методичке РКН.&lt;br/&gt;&lt;br/&gt;RKNHardering &lt;br/&gt;&lt;a href=&#34;https://github.com/xtclovver/RKNHardering&#34;&gt;https://github.com/xtclovver/RKNHardering&lt;/a&gt; &lt;br/&gt;&lt;br/&gt;yourvpndead &lt;br/&gt;&lt;a href=&#34;https://github.com/loop-uh/yourvpndead&#34;&gt;https://github.com/loop-uh/yourvpndead&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Можно затестить спалят ли вашу амнезию впн приложухи макс, вк, яндекс (скорее всего спалят и очень легко).&lt;br/&gt;Чтобы избежать этого есть 2 пути: телефон без рус гос приложений и впн на роутере с openwrt  &lt;/blockquote&gt;
    </content>
    <updated>2026-04-08T17:47:07Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsgv5tpv8wparkrerhr73nxa58r55txpeptzra6rzs2vjd0t3ttm4gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032u6cqnl</id>
    
      <title type="html">На гитхабе появились приложения ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsgv5tpv8wparkrerhr73nxa58r55txpeptzra6rzs2vjd0t3ttm4gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032u6cqnl" />
    <content type="html">
      На гитхабе появились приложения для андроид с проверкой обнаружения впн на устройстве. Реализовано всё это по методичке РКН.&lt;br/&gt;&lt;br/&gt;RKNHardering &lt;br/&gt;&lt;a href=&#34;https://github.com/xtclovver/RKNHardering&#34;&gt;https://github.com/xtclovver/RKNHardering&lt;/a&gt; &lt;br/&gt;&lt;br/&gt;yourvpndead &lt;br/&gt;&lt;a href=&#34;https://github.com/loop-uh/yourvpndead&#34;&gt;https://github.com/loop-uh/yourvpndead&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Можно затестить спалят ли вашу амнезию впн приложухи макс, вк, яндекс (скорее всего спалят и очень легко).&lt;br/&gt;Чтобы избежать этого есть 2 пути: телефон без рус гос приложений и впн на роутере с openwrt 
    </content>
    <updated>2026-04-08T17:40:14Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqswsp55yr4zrkf9jn2palgsd0hxelpclzt2up9ld7y5nyfxfms5l3gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032j97hup</id>
    
      <title type="html">Nostr Mail должен позволить болтать с ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqswsp55yr4zrkf9jn2palgsd0hxelpclzt2up9ld7y5nyfxfms5l3gzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032j97hup" />
    <content type="html">
      Nostr Mail должен позволить болтать с юзерами из Delta Chat. &lt;blockquote class=&#34;border-l-05rem border-l-strongpink border-solid&#34;&gt;&lt;div class=&#34;-ml-4 bg-gradient-to-r from-gray-100 dark:from-zinc-800 to-transparent mr-0 mt-0 mb-4 pl-4 pr-2 py-2&#34;&gt;quoting &lt;br/&gt;&lt;span itemprop=&#34;mentions&#34; itemscope itemtype=&#34;https://schema.org/Article&#34;&gt;&lt;a itemprop=&#34;url&#34; href=&#34;/note1dyag7naxyypjydet32wgsgaeetg7w6dyzywntkgwx7z82ny90vsqrqhvkc&#34; class=&#34;bg-lavender dark:prose:text-neutral-50 dark:text-neutral-50 dark:bg-garnet px-1&#34;&gt;note1dya…hvkc&lt;/a&gt;&lt;/span&gt; &lt;/div&gt; New wave of nostr grants: Amethyst Desktop, Nostr Mail, Nostrord, and Nurunuru. Onward 🫡 &lt;a href=&#34;https://opensats.org/blog/sixteenth-wave-of-nostr-grants&#34;&gt;https://opensats.org/blog/sixteenth-wave-of-nostr-grants&lt;/a&gt; &lt;/blockquote&gt;
    </content>
    <updated>2026-04-08T07:11:50Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqs2q7y4ga44an0jnf3s6ac9ghu7a4tfjup97eqg4u8u35wwn9u7l6qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630323356qf</id>
    
      <title>Nostr event nevent1qqs2q7y4ga44an0jnf3s6ac9ghu7a4tfjup97eqg4u8u35wwn9u7l6qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630323356qf</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqs2q7y4ga44an0jnf3s6ac9ghu7a4tfjup97eqg4u8u35wwn9u7l6qzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w630323356qf" />
    <content type="html">
      #nostr  &lt;img src=&#34;https://dweb.link/ipfs/Qmc2RYRDsmzTbadvALNMZxRRjMGXuBzL65wDgQBLVDnhM7?filename=17756314221504841775631399613.jpg&#34;&gt; 
    </content>
    <updated>2026-04-08T06:57:05Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsvr4yavykm2fhhcxh2x5dqv3s4vs9nmcef4s22j9rycls84yqf5rgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032yngpwd</id>
    
      <title type="html">Use 0xchat nostr client. You can use telegram web in 0xchat. Web ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsvr4yavykm2fhhcxh2x5dqv3s4vs9nmcef4s22j9rycls84yqf5rgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032yngpwd" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqjzzdq8a8xfegqrna7n50qea3q8z97794cqmju7qnv5agar8z7cc27nqc5&#39;&gt;nevent1q…nqc5&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Use 0xchat nostr client. You can use telegram web in 0xchat. Web version of telegram is the safest. 0xchat has mini-browser. 
    </content>
    <updated>2026-04-07T06:20:50Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsdqgc7awkt3g4mqje2cclnu86nawaj9tm9ns24exyqpzt5decexmgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032rw8fhn</id>
    
      <title type="html">Telegram can be even worse than WhatsApp. The app sends ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsdqgc7awkt3g4mqje2cclnu86nawaj9tm9ns24exyqpzt5decexmgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032rw8fhn" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqsqlvmszklf8ar6pexrdf3p86dj3jd5yfv3kqt7vsag6ymc04lx2dsx9z37t&#39;&gt;nevent1q…z37t&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;Telegram can be even worse than WhatsApp. The app sends unencrypted traffic - this traffic can leak your metadata and even geolocation to local police. WhatsApp doesn&amp;#39;t have such traffic.&lt;br/&gt;&lt;a href=&#34;https://rys.io/en/179.html&#34;&gt;https://rys.io/en/179.html&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href=&#34;https://www.whonix.org/wiki/Telegram&#34;&gt;https://www.whonix.org/wiki/Telegram&lt;/a&gt; 
    </content>
    <updated>2026-04-06T11:09:38Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsq9590zujmy8sr066xwfqhzeqxtq7qunw4tfel73jckgy2942auvgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032f7dffu</id>
    
      <title type="html">dont use telegram. chats not encrypted, secret chats have ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsq9590zujmy8sr066xwfqhzeqxtq7qunw4tfel73jckgy2942auvgzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032f7dffu" />
    <content type="html">
      In reply to &lt;a href=&#39;/nevent1qqswuyx8amkhlmjfglg5ud62s5wcl4r3wm6axe6at56vfm6ga59c22s9x8vrf&#39;&gt;nevent1q…8vrf&lt;/a&gt;&lt;br/&gt;_________________________&lt;br/&gt;&lt;br/&gt;dont use telegram. chats not encrypted, secret chats have backdoors, metadata not encrypted. telegram shares user data with police 
    </content>
    <updated>2026-04-06T10:33:24Z</updated>
  </entry>

  <entry>
    <id>https://nostr.now/nevent1qqsqqzxe584s28xnqz78wfa8vd0h5mxj9fn5cc4m3cn36uc4tzxy6hqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032c6v02z</id>
    
      <title type="html">0xchat.com #nostr #meme #memes ...</title>
    
    <link rel="alternate" href="https://nostr.now/nevent1qqsqqzxe584s28xnqz78wfa8vd0h5mxj9fn5cc4m3cn36uc4tzxy6hqzyrpslrukdypvwekwxe7we7sglwf082ued46r225m2jgmpl2w63032c6v02z" />
    <content type="html">
      0xchat.com #nostr #meme #memes  &lt;img src=&#34;https://dweb.link/ipfs/QmcCuap3BRdFy6JbhvJpPCfxuMRJbXiqi3NRfjcgQDGzCN?filename=1775467057500353IMG_20260406_091311.jpg&#34;&gt; 
    </content>
    <updated>2026-04-06T09:17:38Z</updated>
  </entry>

</feed>