# v1.22.0: A Code Forge, Navigation Layouts, Chat Layouts, and Wallet Backups

Highlights:

- **Turns the Git tab into a code forge**: a dashboard with an inbox,
  forge-style issue, PR and repository screens, inline review with verdicts,
  and merges of pull requests and patch series on the repository's GRASP
  servers.
- **Opens and updates pull requests from the app**, edits files into a PR,
  and works with private repositories.
- **Trusts only an item's author and its confirmed maintainers** with
  statuses, PR updates, labels, renames and cover notes, so a stranger can no
  longer close or "merge" an issue or PR.
- Adds **navigation layouts**: Stack, Deck, Tabs and Windows on desktop, Stack
  and Deck on Android.
- Adds a **Chat Layout** setting: Bubbles, Compact (IRC/Twitch) or Open
  (assistant-style), with a pinned day indicator.
- **Backs up NWC wallets to relays**, opt-in and encrypted to your own key,
  and restores backups made by Amethyst, Wisp, zap.cooking or Sidecar.
- Reworks the wallet screen, **pays Lightning addresses** and scans QR codes
  on the send screens.
- **Plays games that span several carts**, and carts sent as encrypted chat
  attachments.
- Saves relay settings as you edit them.
- Shows the desktop's logged-in window in about half the time on a cold
  start.

## New Features

### Git Dashboard

- Opens the Git tab on a dashboard: an inbox of the issues, patches and PRs
  you should hear about, your repositories and the ones you follow. The
  repository feed moves one tab over, to Explore.
- Says in each inbox row who did the last thing and what ("merged it · 3
  new"), and filters the inbox by All, Unread and Involved, with Mark all
  read.
- Starts a first-time reader's inbox with only the last week unread.
- Lays the dashboard out in two columns on wide windows, the inbox first.
- Lists Explore's repositories as compact rows, and names the repository's
  bookmark button Follow, as gitworkshop does.

### Git Screens

- Redesigns the issue, PR and repository screens as a code forge: lists led
  by the state's glyph, a "repo / Issues" breadcrumb, source and target
  branches as refs, a Clone line that copies `git clone`, a timeline rail and
  one split button for status actions.
- Redesigns the repository home: maintainers, a section bar with counts, the
  latest commit, recent activity and the README in a panel.
- Redesigns the new-issue screen with Write and Preview tabs, and labels
  picked from the ones the repository's issues already use.
- Draws status changes, cover notes and PR updates as one-line timeline
  entries in the thread, instead of full posts that quoted the PR again.
- Shows the current cover note as the item's description, and steps back
  through older versions to the original.
- Keeps the full diff, Clone, View changes and status buttons for the item's
  own thread; feeds and notifications name the item in one line.
- Drops short commit hashes nobody can act on from cards and repository
  screens.
- Shows the target branch on PR cards, and a Private badge on private
  repositories.
- Draws a card for reviews (kind 7321) and notifies the reviewed item's
  author.
- Notifies you of comments under your issues and PRs that name you only in a
  `P` tag, and leads git system notifications with the repository's name.

### Git Trust

- Applies statuses, PR updates, labels, renames, cover notes and review
  resolutions only from the item's author and the repository's confirmed
  maintainers. A stranger's change reads "Proposed" and changes nothing.
- Judges each change by the roles its signer held when it was signed, as
  gitworkshop does.
- Prefers code from a server serving the commit the maintainers signed
  (kind 30618), and warns when none does.

### Git Review and Triage

- Adds inline review: tap a diff line to comment on it, see comments under
  their lines, resolve threads, and record an ACK, NACK or Changes required
  verdict.
- Renames items, adds labels and takes back your own, and searches issues
  and PRs by title, label or text.
- Adds per-file history, blame, search inside files, a side-by-side diff on
  wide windows and syntax highlighting per file.

### Git Merges and Proposals

- Merges pull requests and patch series on the repository's GRASP servers, as
  gitworkshop does: plans the merge, signs the new state, pushes it, marks the
  item merged and resolves the issues its commits close.
- Merges a revised series' latest revision, and merges repositories mirrored
  to GitHub on their GRASP servers, naming the mirrors that keep the old tip.
- Shows what a merge brings in before it starts, lets you cancel or hide it,
  and gives the git commands to merge by hand when it is blocked.
- Opens pull requests from a branch or a fork, pushed under
  `refs/nostr/<id>`, and lets a PR's author update its branch.
- Edits a file in the code tab and opens the change as a PR.
- Edits a repository's relays, maintainers and default branch in its
  settings.
- Signs git requests to private repositories with NIP-98 (GRASP-08), and
  keeps their events on the repository's relays.
- Offers ngit and git checkout commands, copies a patch, and clones into VS
  Code or IntelliJ.
- Publishes statuses, issues and comments with the tags gitworkshop reads, so
  other clients see them.
- Matches gitworkshop's counts: lists only tagged root patches, splits drafts
  from open PRs, and loads every listed item's state.

### Navigation Layouts

- Adds a Navigation layout setting: Stack, Deck, Tabs or Windows. Desktop
  offers all four; Android offers Stack and Deck.
- Replaces the deck switch with the Deck layout. Accounts that had it on
  start there.
- Opens each screen in its own tab in the Tabs layout, with a strip that shows
  each screen's icon or person's picture, pins sections, and closes a tab on
  hover, middle click or Ctrl/Cmd+W.
- Adds a tab menu that duplicates, pins, copies the link, moves a tab to its
  own window and closes other tabs.
- Opens every screen but the sections in its own OS window in the Windows
  layout, beside its opener and at the size last used.
- Reopens closed tabs and windows with Ctrl/Cmd+Shift+T, opens in the
  background with Ctrl/Cmd-click, and restores open tabs and windows after a
  restart.
- Drops the back arrow from screens with nothing to go back to.

### Chat Layouts

- Adds a Chat Layout setting beside Post Layout: Bubbles (as before),
  Compact (one line per message, like IRC and Twitch) or Open (your messages
  in bubbles, everyone else's as open text, like AI assistant apps).
- Applies it to DMs, public chats, groups and cordn rooms, with swipe to
  reply, long-press and double-tap in all three.
- Pins the current day at the top of Bubbles and Compact chats, and names the
  day in every Open stamp ("Yesterday, 5:20 PM").
- Follows calendar days in day dividers and says "Yesterday".

### Wallet

- Backs up NWC wallets to relays, opt-in, NIP-44 encrypted to your own key,
  in the format Wisp, zap.cooking and Sidecar use.
- Restores the newest backup across apps and relays, lists every wallet
  found with its app and date, and adds only the ones you check.
- Offers a one-tap restore when a backup exists, and offers a backup when you
  add a wallet.
- Reworks the wallet screen: a card per wallet with a settings sheet, a mark
  on the default wallet, brand marks per wallet type, a placeholder instead
  of a false 0 balance, and a hide-balances toggle.
- Pays a Lightning address from the Lightning send screen.
- Adds QR scan buttons to the invoice and on-chain recipient fields.
- Expands a transaction's payment details on tap, naming the payer.
- Draws bitcoin.design activity arrows and Send buttons, and received amounts
  in green.
- Scrolls the Bitcoin card with the other wallets, and gives the wallet entry
  a plain billfold icon.

### Game Cartridges

- Plays games that span several carts, listed in the note's `imeta` tags,
  fetched on Play and checked against their hashes.
- Plays two carts uploaded to one note without names, linked to each other.
- Keeps a multi-cart game's saves under all its carts' hashes, so a
  stranger's note can't reach another game's saves. Single carts keep their
  saves.
- Plays carts sent as encrypted attachments in NIP-17, Marmot and Cordn
  chats.
- Plays a cart a server sent as a re-compressed copy when it still loads as a
  cart, and says so.

### Highlights

- Names a highlight's source by its title, site and author instead of a bare
  domain, for web pages, nostr events, books, papers, podcasts and movies.
- Lists a page's NIP-84 highlights on its URL page.

### Relays and Composers

- Saves relay settings as you edit them, and swaps the X and Save bar for a
  back arrow.
- Republishes a changed relay list only to the relays that joined, and skips
  saves that change nothing.
- Posts with Ctrl+Enter (Cmd+Enter on macOS) from the note, comment and
  public message composers.

## Performance

- Composes only the drawer rows on screen and reads navigation labels when
  they show, halving the drawer's share of the first composition.
- Builds a cart's links only on Play: a crafted note that took 1.45 s and
  398 MB to parse now takes 65 ms and 2 MB.
- Skips the blob-hash lookup on media requests while no encrypted `blossom:`
  key is cached.
- Highlights diffs off the main thread, and edits large files a block at a
  time, at 15-30 ms a keystroke whatever the file's size.

## Improvements and Bug fixes

- Fixes prefetched videos that failed with "container unsupported", and
  stops a partial response from cutting a video short.
- Keeps the player's taps, seek bar, volume swipe and auto-hide working after
  it recomposes, as live streams that republish their event made it.
- Says when an upload lands on a server other than the one you picked, and
  links to the copy a server already holds when it refuses a duplicate.
- Decrypts encrypted `blossom:` attachments from the server the URI resolves
  to.
- Shows profile ratings as the rated person's picture, name and bio instead
  of 64 hex characters.
- Doesn't lose a nostrconnect app's first request when pairing turns the
  signer on.
- Binds a napplet's NAP channel to its document, following the NIP-5D
  transport update, and runs the browser's shim only in the top frame.
- Spaces media evenly above and below in a post's text.
- Sizes the full-width note picture to its header rows.
- Keeps the Notifications feed in the Indented layout whatever the Post
  Layout.
- Lightens the hover wash in light mode.
- Keeps a long zap total on one line in the notification summary.
- Fixes git code that was unreadable in a dark app on a light system, and
  commit times that read "-1h".
- Fixes "Error loading feed: %s" and Dutch scheduled-post counts that showed
  a raw placeholder.
- Translates "Yesterday" in every chat into the nine languages cordn's
  rooms already had.

## Desktop

- Shows the logged-in window in about half the time on a cold start (8.8 s
  to 4.5 s measured): composes once the window has a size, compiles lambdas
  as classes, warms secp256k1, TLS and the window icon on spare cores, and
  dials the account's relays at login.
- Adds a "Draw through XWayland" setting on Wayland, which lets the app use
  the graphics card from the next start.
- Zooms into the full-resolution image, toward the cursor.
- Lets a gallery's cropped image fill its cell.
- Fixes a crash when picking an image in the QR scanner.
- Stops the window from closing when Compose measures a popup that just
  closed.

## Cli

- Adds `amy git merge TARGET [--yes]`, on the app's merge engine.
- Pushes a branch's commits to the GRASP servers in `amy git pr --source` and
  `pr-update --source`, and adds `amy git edit` and
  `amy git announce --private`.
- Adds `amy serve --git-root DIR`, a dev GRASP server beside the relay.
- Adds an end-to-end GRASP test, `cli/tests/git/git-grasp-e2e.sh`.

## Quartz

- Moves to Quartz 2.16.0, and builds on a JitPack build of Quartz main for
  the NIP-34 roles, role history, merge API and gitworkshop interop until a
  release carries them.
- Bumps kiko-kmp to 0.2.4 for multi-cart games.

## Build & Documentation

- Builds the Flatpak bundle on branch `stable`, so Orchard installs it, and
  builds Flathub from v1.21.0.
- Syncs the Homebrew formulas, the cask and the winget manifests to v1.21.0.
- Uses an AppCDS archive in the desktop's dev `run` task.
- Adds `--local-only` to `run-headless.sh`, so a test run reaches only
  local relays.
- Fixes a NIP-46 pairing race that flaked on macOS CI, and a re-encode test
  that collided with other test forks.
- Adds a NIP-46 signer testing reference to the `auth-signers` skill, and
  requires `<plurals>` for counted strings.
- Fixes Sonar findings in the macOS JNI bridge and duplicated literals.
- Moves the Doom napplet's USE button out of the pad's center and stops its
  long-press buzz.

## Contributors

- @npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z
- @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef
- @npub1aeh2zw4elewy5682lxc6xnlqzjnxksq303gwu2npfaxd49vmde6qcq4nwx
- @npub1uac67zc9er54ln0kl6e4qp2y6ta3enfcg7ywnayshvlw9r5w6ehsqq99rx

## Translations

- Czech, German, Swedish, and Portuguese by @npub1e2yuky03caw4ke3zy68lg0fz3r4gkt94hx4fjmlelacyljgyk79svn3eef
