DEV Community

Omostrich 0.3.3: tighter signing grants and safer profile pictures

Omostrich keeps your Nostr key on your own computer and signs for your apps from the Omarchy bar. Two releases landed this morning.

Version 0.3.2 finishes the profile picture hardening that 0.3.1 started, and version 0.3.3 makes your signing permissions narrower and your approval prompts clearer, especially around direct messages.

What changed in 0.3.3

"Always allow" now covers one kind of event, not everything. Before, remembering a signing request for an app meant that app could sign any kind of Nostr event without asking again. Now the button names the kind it covers, for example "Always allow sign kind 4 (DM)", and Authorized apps lists each app's grants kind by kind.

Encrypt and decrypt prompts show who's on the other end. Each request shows the other person as a shortened npub (marked "(you)" when it's yourself) and whether you're encrypting to them or decrypting from them. Encrypt requests also show a short preview of the plain text.

A kind 4 signing request shows its recipient, and DM ciphertext is no longer previewed. None of this goes into the log.

The signer keeps running when notifications can't. If notify-send is missing or fails, Omostrich logs it once, with an error code only, and carries on instead of crashing.

Smaller fixes:

  • Signing requests for kind 14 and kind 1059 (private messages and gift wraps) show a warning and can only be approved once, never remembered.
  • Your public key is handed out without a prompt only to an app that connected this session or that you've remembered. Anyone else gets asked.
  • Gift-wrap notifications look back two days, and unlocking no longer sets off a burst of old ones.

What changed in 0.3.2

0.3.1 put limits on how big your cached profile picture could be, but the file could still carry compressed metadata that expands while the image is being read. A small, hostile picture could push the panel to several gigabytes of memory.

Now the daemon rewrites the downloaded picture down to just the parts needed to draw it, with no re-encoding and no new dependency:

  • PNG keeps only the image data and the colour chunks it needs. An unknown critical chunk is refused.
  • JPEG drops comments, EXIF, ICC, XMP and Photoshop data.
  • GIF keeps the first frame only.
  • WebP keeps the image data and drops everything else. Animated WebP is refused, so the placeholder shows.

Anything after the end of the image is dropped too, and a picture cached by 0.3.1 is fetched again on startup, so the cache only ever holds the stripped copy.

This came out of the Omarchy plugin marketplace review (#12494).

Why it matters

Your signer should do exactly what you agreed to and nothing more. A blanket "always allow" was easy to click and hard to reason about later, and a DM prompt that doesn't say who it's for asks you to approve blind. Per-kind grants and clearer prompts mean you can see what each app is allowed to do and who your messages are going to.

Upgrading

Old blanket signing grants meant "sign any kind", and there's no way to tell which kind you had in mind, so they're removed the first time 0.3.3 starts. The app and its other grants stay, daemon.log names each affected app, and the app asks once more for each kind it needs.

To update an existing install:

cd ~/Projects/omostrich
git pull
npm ci
./install-daemon.sh
./install-plugin.sh
systemctl --user restart omostrich

The restart matters, because the running signer keeps the old code until it's restarted.

The full notes are on the 0.3.2 and 0.3.3 release pages, the code is on GitHub, and more about Omostrich is at omostrich.com. Originally posted on blog.ninepointlabs.com.

Read on DEV Community ↗ ← Back to News

Comments

No comments yet. Start the discussion.