Skip to content

v1.4.0 - #414

Merged
Avi0n merged 48 commits into
mainfrom
dev
Aug 30, 2026
Merged

v1.4.0#414
Avi0n merged 48 commits into
mainfrom
dev

Conversation

@Avi0n

@Avi0n Avi0n commented Aug 30, 2026

Copy link
Copy Markdown
Owner

No description provided.

Avi0n and others added 30 commits July 28, 2026 09:08
- Raise the exact pin from 6.25.1 (held for iPad landscape blur)
- Drop MetalLayerScaleFix; upstream #4373 fixes native scale
- Clamp unresolved identity hex to 2–3 bytes from device hashSize
- Capture width on neighbours response so disconnect does not reflow labels
- Widen colliding unplottable map titles to the full prefix
- Add resolver, view model, and map builder coverage
- Replace per-advert getContact queue with watermarked batch sync
- Stamp phone-clock lastHeard for sort, prune, and backup
- Claim isSyncInProgress as advert-owned so full sync waits
- Admit delta rounds once a full contact fetch completes, so an empty
  radio with no watermark still syncs its first auto-added contact
- Report a busy outcome when another sync holds the claim, so a
  collision keeps its drained keys instead of spending the failure budget
- Cover coalescing, 0x8F rollback, escalation, and prune safety
- Expose contactsStart total via ContactFetchResult (nil when missing)
- Skip orphan prune unless the snapshot is complete and the V-contact can be identified
- Force contacts-only full sync when the local table is at capacity
- Add tests for capacity, truncation, shrink, missing total, and V-contact
- Stamp lastHeard on inbound DM, successful ping, and path response
- Keep radio lastModified on path response
- Cover DM and path response with tests

Co-authored-by: JCBird1012 <jonathan@jcaicedo.com>
- Store every region that verifies a packet's transport code, not first match only
- Surface ambiguous chips in bubbles, message info, and RX log
- Reprocess retained rows when known regions change
Match heard repeats on channel, timestamp, and text.
The connect-time node name is not a join key.
Companion firmware restamps CLI packets to its own RTC.
Stock clock sync then sets the node from that stamp, not the phone.
Rewrite remote clock sync to time <phone-epoch>.
Sync Time and Tools CLI then set the node from the host clock.
Telemetry warned from a login snapshot vs the radio clock.
Device Time used a later CLI clock query. Those two samples
did not match, so the banner stayed after the node looked right.

Measure drift when Device Info loads clock. Show the warning
next to Device Time. Drop the login snapshot and the Telemetry
banner.
- Store new regions with flood allowed, same as firmware put
- Show CLI errors in the Regions section
- Validate the name in the add alert before sending
- * is a packet with no region, not all traffic
- Scroll-to-bottom requests only pin when already at the bottom
- Outgoing and self-sent rows no longer raise the unread badge
- One process PersistenceStore; no second actor on connect
- Registry survives disconnect and only clears on restore
- Reconnect refreshes the loaded window instead of replacing it
- Unique and ambiguous region labels on Frank and Public floods
- Two RX-log rows for the same unique/ambiguous cases
- Hop IDs on Alice's Public flood (live RX-log receive)
- After the connect-failure budget, re-issue connect when the bond
  verified recently or the app is not confirmed active
- isAppActive starts false so a BLE process relaunch keeps the
  pending connect
* feat(contacts): crop profile picture before saving

Adds a pan/pinch crop step between picking a photo (library or file
import) and saving it as a contact's avatar, instead of using the
picked image as-is. Crops via UIImage.draw(in:) rather than raw
CGImage cropping so EXIF-rotated photos crop the same region shown
in the on-screen preview.

* fix: regenerate L10n.swift with swiftgen

The committed generated file didn't match current swiftgen output ordering, tripping the codegen CI check.

* chore: retrigger CI

* fix(contacts): address avatar crop review feedback

Fixes the modal-presentation race between the picker/importer sheets
and the crop cover, decodes and downsamples off the main actor via
ImageIO instead of full-resolution UIImage(data:), removes the
redundant JPEG re-encode by passing the cropped UIImage straight to
the existing avatar processor, swaps the deprecated
MagnificationGesture for MagnifyGesture with a clamped live pinch
value, and drops an unused outer GeometryReader.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: romeo <romeo@romeos-mini-4.home>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
- Keep live pan/zoom covering the crop guide so Choose matches the preview
- Anchor the iPad source menu on the avatar button
- Notify contacts changed after avatar save so the Nodes list updates
- Notify contacts changed so the Nodes list updates nickname and block
- Last incoming in a channel cluster gets a photo when the sender uniquely matches a contact, otherwise initials
- Rooms use the same layout with initials; DMs skip the column
- Start the flight in the same admit turn as the new row
- Skip when scrolled up or Reduce Motion is on
- Key room hops on author prefix
- Place pin A when a unique contact name matches the channel sender
- Simulator channel mocks no longer invent a key prefix
- Bind the loaded field directly so typed text is visible
- Show Apply errors on the Contact Info section
- Keep the character count in the field row
- Store DiscoveredNode.outPathLength as Int so leftover SQLite -1 no longer traps fetch
- DTO still uses UInt8 via truncatingIfNeeded; envelope unchanged
- Store Contact.outPathLength as Int so leftover SQLite -1 no longer traps fetch
- DTO still uses UInt8 via truncatingIfNeeded; envelope unchanged
- Resolve heard-repeat names with NeighborNameResolver so a short-prefix collision is .fallback
- Show FallbackMatchIndicatorView on those Repeat Details rows
The form only allowed dotted IPv4 even though the transport already
resolves names. Keep the typed hostname so reconnect looks it up again.

- Validate IPv4 and DNS hostnames, including .local
- Switch the host field to a URL keyboard
- Trim before save; update copy in all locales
- xcsift prints one summary at EOF, so make test-app looked hung after xcodegen
- heartbeat from the pipe consumer every 30s; lock wait lines include elapsed time
Avi0n and others added 18 commits August 23, 2026 21:27
A busy conversation sized the first fetch to every unread plus
context, which could load thousands of rows on open. Cap that
window at 200; remaining unread pages in via loadOlder.
- xcodebuild can run simctl diagnose (--timeout=600) after a green suite
- pass -collect-test-diagnostics never on test-app and test-store
- Add a list indicator for unseen outgoing .failed sends
- Mark them seen when the conversation is opened
- batchSaveContacts must not wipe existing avatarImageData
- simulator reseed must keep a user-set avatar
- Channel mark leaves other indexes and the same index on another radio
- Room mark leaves the unmarked session
- Swipe-back posted willHide while the keyboard window stayed, dropping the compose bar mid-screen
- Hold current lift during an interactive pop; back-button and keyboard drag still apply the proposed frame
- Open Advanced Settings via navigateToSetting(.advanced)
- Drop the toolbar's private AdvancedSettingsView destination
- Detect language at bake time and show an in-bubble Translate control
- Keep stored message text as-is and cache translations per target
- Put `.translationPresentation` on a later `.background` sibling in chat and room
- Overlay wrapping `.conversationTranslationSession` failed in airplane mode even with packs on disk
- Present the system overlay when in-bubble TranslationSession throws
- Quiet cancel and pack download stay as they are, with no error alert
- Skip language detection and chrome on outgoing chat and from-self room rows
- Drop isOutgoing from BubbleTranslationControl
- Regions UI now sets region default, not home
- Removing the current default also sends region default <null>
- Caption covers originated packets and immediate persist
fix(l10n): revise Portuguese (Portugal) translation
- Mark Portuguese as verified by zadoke #413
- Default-scope keys now use scope, nó, and Adverts
@Avi0n
Avi0n merged commit 8a89656 into main Aug 30, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants