Linux native client
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Silberengel ab3bce931b implement favicon and banner 2 weeks ago
.vscode refinement 2 weeks ago
flatpak Qt initialization 2 weeks ago
src/imwald implement favicon and banner 2 weeks ago
tests beautify the profile pages 2 weeks ago
typings enforce strict typing 2 weeks ago
.gitignore Qt initialization 2 weeks ago
README.md onboarding 2 weeks ago
pyproject.toml implement favicon and banner 2 weeks ago

README.md

imwald

Linux-focused Nostr desktop client: PySide6 UI, SQLite (WAL) as the local store, and a background relay worker that writes events into the same database the UI reads.

Run (development)

cd imwald
python3 -m venv .venv
.venv/bin/pip install -e '.[dev]'
.venv/bin/python -m imwald

The package uses a src/ layout; editable install is enough (no PYTHONPATH needed). For Cursor/Pylance, the repo includes .vscode/settings.json and [tool.pyright] in pyproject.toml so import imwald resolves.

What is implemented today

  • Relays: Read/write sets from your latest kind 10002 (NIP-65); built-in defaults only when you have no usable list. Relay worker restarts when the active account changes. Optional aggr.nostr.land thread subscription when nostr.land is in your write set. Trending slice relay (nostrarchives) mixed into reads.
  • Ingest: NIP-01 id check + BIP-340 signature verification before SQLite upsert; kind 5 tombstones applied on valid deletion events.
  • Feed: Ranked queue (follows, kind 30000 list authors, scores), per-viewer “seen” tracking, OP body rendered as Markdown (offline marked via QuickJS, nh3 sanitize, Python markdown fallback). Thread list, search hits, notifications rows, and “your events” use the same pipeline for plain summaries (no raw # / ** noise in one-liners).
  • Composer: Split Markdown source + live preview; publish to resolved write relays.
  • Accounts: Onboarding wizard, nsec / ncryptsec (NIP-49) storage, composer and NIP-09 publish. New identities get kind 0 metadata with name imwald-anon-<unix_timestamp> (same value as the event’s created_at, unique per publish), a random nature username phrase (e.g. romping chipmunks) for the local account label, and a deterministic forest-themed PNG uploaded to nostr.build (NIP-96 + NIP-98); picture plus a full NIP-92 imeta tag when upload succeeds (otherwise no picture).
  • Other pages: Search (local LIKE), notifications list (DB table + joined event text when present), local DB admin (safe SELECT, purge, NIP-09 hook).

Dependencies (runtime)

See pyproject.toml: PySide6, cryptography, bech32, coincurve, PyNaCl, websockets, quickjs-ng, nh3, markdown (Markdown rendering is fully local; marked is vendored under src/imwald/ui/assets/vendor/).

Not in scope (yet)

Server-backed grammar (LanguageTool), translation, read-aloud, rich media gallery, full “profile app” shell, or a separate bulletin-board product surface—the README used to list aspirational items; they are not current features unless added in code.