Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
453 commits
Select commit Hold shift + click to select a range
dcb77dc
Merge remote-tracking branch 'origin/main' into codex/reproducible-bu…
callebtc Jul 29, 2026
05896f3
fix: route every hotspot failure through one teardown path
moehamade Jul 29, 2026
56f5221
voice: watch-quality recording UX - slide-to-cancel with magnetic X t…
callebtc Jul 29, 2026
97026d7
fix: lock wear dependencies in CI
callebtc Jul 29, 2026
8eddcb1
voice: keep pill height identical between rest and recording - constr…
callebtc Jul 29, 2026
7c67df4
fix: isolate canonical container workspace
callebtc Jul 29, 2026
b5fd346
fix: test the hotspot hold under the lock that publishes Aware
moehamade Jul 29, 2026
ff0578c
Merge pull request #808 from moehamade/fix/hotspot-wifi-direct-reliab…
callebtc Jul 29, 2026
c6e64b1
wear: fix DM notification delivery
callebtc Jul 29, 2026
538701c
wear: shorten mesh status notification
callebtc Jul 29, 2026
6a904a1
voice: compute cancel verdict from the final pointer coordinate - rec…
callebtc Jul 29, 2026
1dae188
Merge pull request #806 from permissionlesstech/codex/persistent-conv…
callebtc Jul 29, 2026
6f60b15
Merge pull request #810 from permissionlesstech/codex/wear-notificati…
callebtc Jul 29, 2026
01b59a7
Merge pull request #809 from permissionlesstech/voice-recording-ux
callebtc Jul 29, 2026
ad05bc5
Header: improve location control accessibility and crowding
qutad Jul 29, 2026
9ed5cb2
Merge pull request #798 from permissionlesstech/codex/reproducible-bu…
callebtc Jul 29, 2026
a105d88
Polish persistent private conversations
callebtc Jul 29, 2026
c382c17
mesh-lab: fail closed when evidence dir is empty
callebtc Jul 29, 2026
889c262
Merge pull request #802 from permissionlesstech/codex/mesh-lab-agent-…
callebtc Jul 29, 2026
172d086
Fix live conversation identity state updates
callebtc Jul 29, 2026
a21c024
Fix conversation persistence review issues
callebtc Jul 29, 2026
363f8c5
fix: restore background peer availability alerts
callebtc Jul 29, 2026
11511df
style: remove emoji from peer alert title
callebtc Jul 29, 2026
3410aaf
Merge pull request #815 from permissionlesstech/codex/polish-persiste…
callebtc Jul 29, 2026
4fad876
Merge main and resolve notification conflicts
callebtc Jul 29, 2026
95d6922
feat: add Android UI visual review skill
callebtc Jul 29, 2026
56f91a9
Merge pull request #817 from permissionlesstech/codex/android-ui-visu…
callebtc Jul 29, 2026
2807a16
fix: rate-limit peer availability alerts
callebtc Jul 29, 2026
e99d5ac
Merge remote-tracking branch 'origin/main' into codex/fix-active-peer…
callebtc Jul 29, 2026
00ef72c
fix: clear peer alerts on mesh shutdown
callebtc Jul 29, 2026
5b79da2
Merge pull request #816 from permissionlesstech/codex/fix-active-peer…
callebtc Jul 29, 2026
6288cd3
fix the ui issue in the chat screen
spradhan7656 Jul 29, 2026
31d822e
fix the ui issue in the chat screen
spradhan7656 Jul 29, 2026
1c3626e
Merge pull request #1 from spradhan7656/chat-ui-issue
spradhan7656 Jul 29, 2026
d465f42
wear: fix private message navigation
callebtc Jul 29, 2026
bf5bd8c
fix: restore Android Studio sync with strict Gradle security
callebtc Jul 29, 2026
44560b9
Add Watch peer profiles and verification
callebtc Jul 29, 2026
4f567ec
Merge pull request #800 from a1denvalu3/issue-764-language-picker
callebtc Jul 29, 2026
b9ca8ed
Add Cashu payment chips and pay command
a1denvalu3 Jul 27, 2026
adce27c
Preview Cashu tokens in message composer
a1denvalu3 Jul 27, 2026
6f4f6b9
Keep Cashu composer preview compact
a1denvalu3 Jul 27, 2026
3b0e569
ci: use exact Temurin catalog version
callebtc Jul 29, 2026
199f95f
Fix Cashu payment review issues
a1denvalu3 Jul 27, 2026
4fdc9ba
feat: unify people lists with conversation-row avatar design
callebtc Jul 29, 2026
a306340
Preserve Watch navigation across recreation
callebtc Jul 29, 2026
79e04ed
Merge pull request #820 from permissionlesstech/codex/fix-wear-privat…
callebtc Jul 29, 2026
9ca1413
feat: replace Leaflet WebView geohash picker with animated 3D globe
callebtc Jul 29, 2026
9f81a1e
Fix peer verification status and badge
callebtc Jul 29, 2026
c7ced41
Merge pull request #822 from permissionlesstech/uniform-lists-design
callebtc Jul 29, 2026
29f9eb0
Merge pull request #821 from permissionlesstech/codex/fix-android-stu…
callebtc Jul 29, 2026
79bf154
feat: overlay country borders and cities on the globe picker
callebtc Jul 29, 2026
70185ae
Refine private chat header actions
callebtc Jul 29, 2026
b073dc2
Merge pull request #824 from permissionlesstech/codex/fix-peer-verifi…
callebtc Jul 29, 2026
03de6f3
fix: allow targeting polar geohashes
callebtc Jul 29, 2026
44f62a3
Merge pull request #776 from a1denvalu3/feat/cashu-chips-android
callebtc Jul 29, 2026
fe93be3
Remove generated Gradle daemon JVM config
callebtc Jul 29, 2026
57cc39d
Merge main into fix/766-header-location-control
callebtc Jul 29, 2026
2176160
Merge pull request #823 from permissionlesstech/ui/geohash-globe-picker
callebtc Jul 29, 2026
a5dfe9f
Polish network conversation rows
callebtc Jul 29, 2026
5dd7b2c
Restore Gradle verification metadata
callebtc Jul 29, 2026
1774414
Merge pull request #819 from spradhan7656/main
callebtc Jul 29, 2026
97d6e8a
Merge pull request #825 from permissionlesstech/codex/network-tab-lis…
callebtc Jul 29, 2026
9f02235
Fix stale peer lifecycle cleanup
a1denvalu3 Jul 29, 2026
6ebbae0
Rerun CI
a1denvalu3 Jul 29, 2026
3562ad1
fix(wifi-aware): count hotspot radio holds and never drop a restart r…
moehamade Jul 29, 2026
46de1a3
fix: skip unknown file TLVs instead of dropping the transfer
vincenzopalazzo Jul 27, 2026
141adf5
fix(hotspot): only remove our own group; ask consent to replace a for…
moehamade Jul 29, 2026
5859ac2
fix(hotspot): confirm a group is ours before trusting or removing it
moehamade Jul 29, 2026
33538fa
Merge pull request #827 from a1denvalu3/fix/stale-peer-cleanup
callebtc Jul 30, 2026
1699cc7
Header: preserve compact channel accessibility state
callebtc Jul 30, 2026
b6ad897
fix(hotspot): revalidate ownership during teardown
callebtc Jul 30, 2026
e311649
fix(panic): clear in-memory networking caches, router outbox, and Nos…
TheCodeSmith404 Jul 30, 2026
b692ec7
Merge pull request #828 from moehamade/fix/hotspot-group-consent
callebtc Jul 30, 2026
1a953a1
Fix private conversation alias isolation
callebtc Jul 30, 2026
2a43265
Optimize geohash globe rendering and gestures
a1denvalu3 Jul 30, 2026
5bde4e0
Close fully visible geohash outlines
a1denvalu3 Jul 30, 2026
8602db8
Add geohash globe render quality selector
a1denvalu3 Jul 30, 2026
fa4442d
Merge pull request #832 from permissionlesstech/codex/fix-conversatio…
callebtc Jul 30, 2026
6fc4583
Stabilize globe quality selector layout
a1denvalu3 Jul 30, 2026
6edd361
Fix globe land fill orientation
a1denvalu3 Jul 30, 2026
0d7f8ce
Prevent whole-globe land fills
a1denvalu3 Jul 30, 2026
aaac810
Merge pull request #829 from TheCodeSmith404/fix/panic-mode-memory-pu…
callebtc Jul 30, 2026
ae70c02
Merge pull request #833 from a1denvalu3/optimize/geohash-picker-low-end
callebtc Jul 30, 2026
643f329
Merge pull request #813 from qutad/fix/766-header-location-control
callebtc Jul 30, 2026
8abe570
Restore location notes access
callebtc Jul 30, 2026
7e22480
fix: verify geohash signatures off main thread
a1denvalu3 Jul 30, 2026
daee720
Merge pull request #834 from permissionlesstech/codex/restore-locatio…
callebtc Jul 30, 2026
1a792ec
fix: harden unknown file TLV parsing
callebtc Jul 30, 2026
c737412
Merge remote-tracking branch 'upstream/main' into fix/geohash-signatu…
a1denvalu3 Jul 30, 2026
f34559a
Add README feature screenshots
callebtc Jul 30, 2026
e07e3c9
test: sign background geohash events
a1denvalu3 Jul 30, 2026
87184ed
globe fixes
callebtc Jul 30, 2026
13f15ca
Merge pull request #836 from permissionlesstech/codex/restore-globe-p…
callebtc Jul 30, 2026
55f8e5e
Upgrade README screenshots to QHD
callebtc Jul 30, 2026
286c801
Clarify README screenshot descriptions
callebtc Jul 30, 2026
daa6cfa
Merge remote-tracking branch 'origin/main' into codex/readme-showcase
callebtc Jul 30, 2026
4a6aa48
Refresh README screenshots for Pixel layout
callebtc Jul 30, 2026
4b2a9c3
preserve original bytes
areebahmeddd Jul 30, 2026
0f1eb56
Center README globe on the Middle East
callebtc Jul 30, 2026
0e3a4fd
Refine README mesh conversation
callebtc Jul 31, 2026
e8e869d
Add Android README screenshot skill
callebtc Jul 31, 2026
13669b0
Merge pull request #837 from permissionlesstech/codex/readme-screensh…
callebtc Jul 31, 2026
119b330
Merge pull request #835 from permissionlesstech/codex/readme-showcase
callebtc Jul 31, 2026
229d93b
Merge pull request #826 from vincenzopalazzo/fix/file-tlv-forward-compat
callebtc Jul 31, 2026
5f58dbf
agents update
callebtc Jul 31, 2026
9b69c9f
Merge pull request #839 from permissionlesstech/docs/update-repositor…
callebtc Jul 31, 2026
e62e3bd
Replace Wear launcher wordmark with green BitChat glyph
callebtc Jul 31, 2026
83eaebc
Fix geohash join channel routing
phuctoan123 Jul 31, 2026
e865a7f
Update repository privacy instructions
callebtc Jul 31, 2026
cb6d689
Merge pull request #842 from permissionlesstech/codex/update-agents-md
callebtc Jul 31, 2026
cbc59aa
feat(voice): add live push-to-talk
callebtc Jul 31, 2026
efeb9b5
Fix Wear chat auto-scroll timing
callebtc Jul 31, 2026
44b2b8c
Fix first Wear message auto-scroll
callebtc Jul 31, 2026
e9bc8e0
docs(protocol): specify live voice v1
callebtc Jul 31, 2026
e907773
Merge pull request #843 from permissionlesstech/codex/issue-753-live-ptt
callebtc Jul 31, 2026
e07a38f
Merge pull request #844 from permissionlesstech/codex/fix-wear-chat-a…
callebtc Jul 31, 2026
94d5fa3
feat(chat): add bubbles chat UI mode with peer-color bubbles
callebtc Jul 31, 2026
862fd84
Hide the command and mention popups after a message is sent
heyaim Jul 31, 2026
7569fba
feat(chat): align self media rows with bubbles chat UI mode
callebtc Aug 1, 2026
af91aba
feat(chat): pull sender and delivery status into bubbles, thin-space …
callebtc Aug 1, 2026
7247d0a
feat(chat): constant-width two-check delivery marker that lights up g…
callebtc Aug 1, 2026
6eafa59
feat(chat): anchor delivery checks to the bubble's bottom-end corner
callebtc Aug 1, 2026
498c351
feat(chat): right-align bubble timestamps beside the delivery checks
callebtc Aug 1, 2026
d0c2a39
Merge pull request #840 from permissionlesstech/codex/wear-speech-bub…
callebtc Aug 1, 2026
6d9dfd9
fix(chat): trail bubble timestamp and checks inline with the body
callebtc Aug 1, 2026
79d2e03
fix(chat): keep bubble meta flush-right without extra lines or width
callebtc Aug 1, 2026
d85401f
fix(chat): never let the bubble meta cluster influence text wrapping
callebtc Aug 1, 2026
bd5ae87
feat(chat): never show our own nickname in bubbles mode
callebtc Aug 1, 2026
aad0c4d
feat(settings): combine theme and chat style into one card
callebtc Aug 1, 2026
2e943b2
Merge pull request #846 from permissionlesstech/bitchat-ui-bubbles
callebtc Aug 1, 2026
1965d4b
Refresh README feature screenshots
callebtc Aug 1, 2026
5cc181f
Improve README screenshot capture recipe
callebtc Aug 1, 2026
53cd038
Merge pull request #851 from permissionlesstech/codex/refresh-readme-…
callebtc Aug 1, 2026
b43dc1e
feat(ui): wrap image and voice messages in bubble shells
callebtc Aug 1, 2026
17a173a
Fix cropped README screenshot controls
callebtc Aug 1, 2026
dcec0c1
Test README screenshot crop handling
callebtc Aug 1, 2026
28bd6bd
Merge pull request #852 from permissionlesstech/codex/fix-readme-scre…
callebtc Aug 1, 2026
b8c7470
Merge pull request #847 from heyaim/hide-command-suggestions-after-send
callebtc Aug 1, 2026
2325b7c
Remove periodic GATT RSSI polling
callebtc Aug 1, 2026
a49f382
Merge pull request #853 from permissionlesstech/codex/remove-rssi-pol…
callebtc Aug 2, 2026
c02dda3
Automated update of relay data - Sun Aug 2 06:55:18 UTC 2026
actions-user Aug 2, 2026
657fee0
fix: stop the GitHub release check exhausting its own rate limit
moehamade Jul 28, 2026
389fbd2
feat: show what an APK download is actually doing
moehamade Jul 28, 2026
f33ce0b
fix: gate secondary rate limits and name the Tor wait correctly
moehamade Jul 29, 2026
b79ae8e
fix: stop reporting a Tor wait during the fetch, and serve the cache on
moehamade Jul 29, 2026
8e5bb2e
fix: clear the downloading state when a download is cancelled
moehamade Jul 29, 2026
77f3c0c
fix: free the UI on cancel, and scope the rate-limit gate to its route
moehamade Jul 29, 2026
4200871
fix: key the rate-limit gate to the selected route, and drop the forc…
moehamade Jul 29, 2026
2d29547
fix: keep a cooldown per route instead of discarding it on a switch
moehamade Jul 29, 2026
309df1a
fix: evaluate the rate-limit gate against the route each request takes
moehamade Jul 29, 2026
821ec7c
fix: check the cooldown on every attempt, not once before the loop
moehamade Jul 29, 2026
7dab627
build: take material3 1.5.0-alpha for the wavy progress indicators
moehamade Jul 30, 2026
bfb0c82
feat: rebuild the prepare-for-sharing row and localize its failures
moehamade Jul 30, 2026
700e9aa
fix: carry download failures by stable name, not resource id
moehamade Jul 31, 2026
408d1c7
fix: name the retry backoff instead of calling it a network wait
moehamade Aug 1, 2026
b60b512
fix: observe cancellation before promoting a verified APK
moehamade Aug 1, 2026
2c19d00
fix(apk): preserve local sharing during update checks
moehamade Aug 2, 2026
bc572cc
fix(ui): make media bubble shell long-clickable
callebtc Aug 2, 2026
49753cc
Merge pull request #860 from permissionlesstech/feat/bubble-media-mes…
callebtc Aug 2, 2026
94e46da
Merge main into i18n backfill branch
callebtc Aug 2, 2026
d852f3d
Merge pull request #744 from aharshit123456/i18n/backfill-incomplete-…
callebtc Aug 2, 2026
1376b55
Delay nearby peer availability notification
callebtc Aug 2, 2026
094657e
Merge pull request #861 from permissionlesstech/codex/delay-peer-avai…
callebtc Aug 2, 2026
a898c06
build: relock :wear after mockwebserver entered the shared test bundle
moehamade Aug 3, 2026
99bed51
build: drop verification entries for the reverted material3 alpha
moehamade Aug 3, 2026
ca992d1
Merge branch 'main' into codex-fix-geohash-join-channel-routing
phuctoan123 Aug 4, 2026
55fd6ad
Automated update of relay data - Sun Aug 9 06:17:04 UTC 2026
actions-user Aug 9, 2026
000a8ac
fix: build each shared HTTP client once instead of racing to replace it
moehamade Aug 9, 2026
7b86baf
fix(apk): give the persisted store sole ownership of rate-limit coold…
moehamade Aug 9, 2026
52f14cc
fix(apk): stop a reset header alone from marking a 403 rate limited
moehamade Aug 9, 2026
8f21ad5
fix(apk): keep the local APK shareable across a restart mid-download
moehamade Aug 9, 2026
ac47af9
fix: synchronize totalChecks increment in NostrEventDeduplicator
Chessing234 Aug 10, 2026
4007bae
Fix syntax error in CommandProcessorTest
phuctoan123 Aug 11, 2026
fcb4562
Merge pull request #812 from moehamade/fix/apk-download-and-rate-limit
callebtc Aug 11, 2026
920eed5
Bump phone app to 2.0.0
callebtc Aug 11, 2026
76bf226
fix(nostr): cap DM envelope backdating at 24 hours
Aug 11, 2026
47e725a
Merge pull request #870 from permissionlesstech/bump-version-2.0.0
callebtc Aug 11, 2026
7e8ea63
Prepare reproducible Wear 0.1.0 release
callebtc Aug 11, 2026
c9a4e68
Serialize reproducible release modules
callebtc Aug 11, 2026
bad78f8
Merge branch 'permissionlesstech:main' into fix/nostr-ios-dm-lookback
qutad Aug 11, 2026
bc03d78
changed to 23-hour-45-minute maximum backdating window
Aug 11, 2026
1a0d871
Merge pull request #871 from permissionlesstech/watch-release-0.1.0
callebtc Aug 11, 2026
6c5d7d1
Fix reproducible R8 mapping output
callebtc Aug 11, 2026
c9938a3
Merge pull request #872 from permissionlesstech/codex/fix-reproducibl…
callebtc Aug 11, 2026
c549bdb
Bump Android release to 2.0.1
callebtc Aug 11, 2026
16a2231
Disable nondeterministic Compose group mapping
callebtc Aug 11, 2026
93e9594
Merge pull request #873 from permissionlesstech/codex/bump-version-2.0.1
callebtc Aug 11, 2026
acfbacf
fix(nostr): reserve two-hour DM timestamp margin
Aug 11, 2026
5156f7d
Restore PRIVACY_POLICY.md
callebtc Aug 11, 2026
22f87a4
Add announce capability bit assignments
Aug 13, 2026
87ccfe3
Use the shared packet identity for duplicate detection
Chessing234 Aug 15, 2026
4ef1b9c
Pin the collision, the replay, and the peer scoping
Chessing234 Aug 15, 2026
b028270
Automated update of relay data - Sun Aug 16 06:08:32 UTC 2026
actions-user Aug 16, 2026
9167013
Merge pull request #863 from areebahmeddd/fix/preserve-wire-payload
callebtc Aug 17, 2026
35ed441
Merge pull request #841 from phuctoan123/codex-fix-geohash-join-chann…
callebtc Aug 17, 2026
646044c
Clarify capability authentication scope
callebtc Aug 17, 2026
03d1da5
Fix CommandProcessor test syntax
callebtc Aug 17, 2026
2318b51
Merge pull request #897 from permissionlesstech/codex/fix-command-pro…
callebtc Aug 17, 2026
db97c60
Merge remote-tracking branch 'origin/main' into feat/announce-capabil…
callebtc Aug 17, 2026
09b481f
Merge pull request #876 from qutad/feat/announce-capability-bits
callebtc Aug 17, 2026
d55754d
Automated update of relay data - Sun Aug 23 06:09:25 UTC 2026
actions-user Aug 23, 2026
6bdcd46
fix(nostr): keep retrying relays instead of giving up on them forever
Chessing234 Aug 24, 2026
eab894c
Merge pull request #743 from aharshit123456/fix/geohash-signature-ver…
callebtc Aug 24, 2026
5852fca
Fix Wear content clipping on watch shapes
callebtc Aug 24, 2026
2e41dab
Add round-screen responsive Wear insets
callebtc Aug 24, 2026
7788328
Keep Wear chat rows clear of controls
callebtc Aug 24, 2026
5d66b69
Clip Wear messages below the chat header
callebtc Aug 24, 2026
4a1de47
Cover transformed Wear header boundary
callebtc Aug 24, 2026
f744038
Preserve width for Wear Material cards
callebtc Aug 24, 2026
45915fa
Tune Wear header boundary by screen shape
callebtc Aug 24, 2026
34f9488
Restore Wear chat content space
callebtc Aug 24, 2026
ed617f0
Fix Wear chat autoscroll and focal scaling
callebtc Aug 24, 2026
1a9f6be
fix: destroy conversation database files when panic wipe throws
Chessing234 Aug 25, 2026
33c1ebf
Merge pull request #909 from Chessing234/fix/panic-wipe-destroy-db-on…
callebtc Aug 25, 2026
898cfde
Restore Wear chat edge fading
callebtc Aug 26, 2026
3ed4622
Fade Wear chat at screen contour
callebtc Aug 26, 2026
a125da4
Polish Wear shape-aware layout implementation
callebtc Aug 26, 2026
7cf5286
Fix slow Wear scroll intent detection
callebtc Aug 26, 2026
4f828b5
Merge pull request #916 from permissionlesstech/codex/fix-wear-shape-…
callebtc Aug 26, 2026
e65039f
chore: retrigger ci
Chessing234 Aug 30, 2026
5800583
chore: retrigger ci
Chessing234 Aug 30, 2026
e50cf9c
chore: retrigger ci
Chessing234 Aug 30, 2026
1c33df7
Automated update of relay data - Sun Aug 30 06:16:55 UTC 2026
actions-user Aug 30, 2026
06cdb0f
Bump Android version to 2.0.2
callebtc Aug 30, 2026
81ba775
Merge pull request #923 from permissionlesstech/codex/bump-version-2.0.2
callebtc Aug 30, 2026
afad3c5
Fix Wear layouts on small round displays
callebtc Sep 5, 2026
9a399cc
Automated update of relay data - Sun Sep 6 06:16:30 UTC 2026
actions-user Sep 6, 2026
0897410
Compact Wear chat headers and stabilize scroll controls
callebtc Sep 7, 2026
eb9ce65
Merge remote-tracking branch 'origin/main' into codex/wear-ui-shape-a…
callebtc Sep 7, 2026
f352a3e
Merge pull request #931 from permissionlesstech/codex/wear-ui-shape-a…
callebtc Sep 7, 2026
0fce9fa
Bump Wear OS version to 0.1.3
callebtc Sep 7, 2026
936a4cd
Merge pull request #932 from permissionlesstech/codex/release-wear-0.1.3
callebtc Sep 7, 2026
fa1727d
docs: simplify packet deduplication comment
callebtc Sep 7, 2026
9e5a07b
Merge pull request #907 from Chessing234/fix/relay-reconnect-recovery
callebtc Sep 7, 2026
9444acd
Merge pull request #869 from qutad/fix/nostr-ios-dm-lookback
callebtc Sep 7, 2026
010789a
Merge pull request #882: strengthen packet deduplication
callebtc Sep 7, 2026
945c9e0
Merge pull request #866 from Chessing234/fix-dedup-total-checks-race
callebtc Sep 7, 2026
c127eb8
Automated update of relay data - Sun Sep 13 06:20:34 UTC 2026
actions-user Sep 13, 2026
f986b19
Automated update of relay data - Sun Sep 20 06:16:50 UTC 2026
actions-user Sep 20, 2026
1b8a825
Automated update of relay data - Sun Sep 27 06:18:27 UTC 2026
actions-user Sep 27, 2026
795715a
Automated update of relay data - Sun Oct 4 08:04:00 UTC 2026
actions-user Oct 4, 2026
036364e
Add Wear ongoing activity for the mesh service
callebtc Oct 6, 2026
8d514f6
Merge pull request #966 from permissionlesstech/wear-ongoing-activity
callebtc Oct 6, 2026
37305e7
Redesign Wear OS launcher and notification icons
callebtc Oct 6, 2026
2354822
Merge pull request #967 from permissionlesstech/claude/wearos-logo-re…
callebtc Oct 6, 2026
d928d21
Bump Wear release to 0.1.4
callebtc Oct 6, 2026
6803d6d
Merge pull request #968 from permissionlesstech/release-wear-0.1.4
callebtc Oct 6, 2026
6ade682
Automated update of relay data - Sun Oct 11 06:18:45 UTC 2026
actions-user Oct 11, 2026
5d66415
Merge upstream permissionlesstech/bitchat-android main into cirabit
sarahsec Oct 15, 2026
81696ed
build: regenerate dependency verification metadata and app lockfile; …
sarahsec Oct 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
260 changes: 260 additions & 0 deletions .agents/skills/android-readme-screenshot-studio/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,260 @@
---
name: android-readme-screenshot-studio
description: Create or refresh polished, high-resolution screenshots of the Bitchat Android app for README and repository showcase use. Use this skill whenever a user asks for README screenshots, app-store-like repository images, a populated mesh-chat showcase, voice-note or media conversation captures, a geohash globe image, higher-resolution Android emulator captures, or a PR that adds or replaces documentation screenshots. It owns the complete workflow from latest-main isolation and deterministic synthetic fixtures through real app rendering, visual inspection, system-chrome cropping, README asset updates, clean builds, and an optional PR. Do not use it for before/after UI regression evidence, which belongs to android-ui-visual-review, or for physical mesh behavior, which belongs to mesh-lab.
compatibility: Requires git, gh, the Android SDK and emulator, adb, Java/Gradle, Python 3, and image inspection support. FFmpeg is useful for capture-only media preparation.
---

# Android README Screenshot Studio

Create repository screenshots from the real Bitchat Android UI, not from a
drawn mockup. The result should look intentional enough for the top of the
README while remaining reproducible, synthetic, and honest about what a static
emulator capture proves.

## Resolve the brief

Extract as much as possible from the conversation before asking questions.
Confirm or infer:

1. Which surfaces are needed, such as mesh chat and geohash globe.
2. The exact visible state and ordering. Treat phrases like “photo, messages,
three voices, thumbs-up” as a chronological contract rather than a loose
suggestion.
3. Whether existing README images should be preserved, replaced, or added.
4. The target base. Default repository work to the latest `origin/main`.
5. Whether GitHub publication and merge are authorized. A request to “open a
PR and merge it” authorizes both; otherwise do not merge.

Do not invent the subject of a requested photo. Nicknames, channel names, or
previous fixture copy are not sufficient justification for choosing an outdoor,
urban, political, or personal scene. Reuse an existing rights-safe asset when
the subject should remain stable, or ask for the intended subject. If the user
explicitly approves synthetic imagery, disclose it and keep its source
capture-only unless they request a committed asset.

Read [references/showcase-recipes.md](references/showcase-recipes.md) for every
run. It contains the concrete mesh-chat and globe recipes, framing guidance,
the verified current-pair fast path, and the final acceptance checklist. When
the request matches the existing README pair and the production UI has not
materially changed, try that fast path first and then validate every visible
result. Fall back to tracing the current implementation when an entry point,
state model, or composition has changed.

When a populated screen requires a debug fixture, also read
[../android-ui-visual-review/references/fixture-recipes.md](../android-ui-visual-review/references/fixture-recipes.md).

## Work in a fresh tree

Protect the user's active checkout:

1. Inspect `git status` without modifying it.
2. Fetch `origin/main`.
3. Create a new `codex/` branch in a temporary worktree rooted at the current
`origin/main`.
4. Keep screenshots and raw captures in a separate temporary artifact
directory so cleanup or checkout operations cannot remove them.

Do not switch the user's original checkout, reuse a dirty branch, or mix an
unrelated PR into the screenshot change. If the request continues an existing
screenshot PR, reuse its already-isolated worktree only after verifying its
head and base.

## Establish the capture contract

Before building, write a compact local matrix containing:

- surface and navigation path;
- chronological fixture contents;
- expected visible top and bottom rows;
- emulator profile class, portrait orientation, theme, and locale;
- crop policy and final asset dimensions;
- existing asset path and README reference;
- behaviors the static screenshot does not prove.

Use the current production UI and latest `main` interaction model. Trace the
screen entry point and state source before adding a fixture. A beautiful capture
of a stale or fake UI is not acceptable.

## Use a high-resolution Android canvas

Prefer the newest stable Android runtime installed locally and a large,
high-density portrait emulator profile. Reuse a previously validated capture
profile when it remains available, but verify the guest properties and keep
the resulting profile facts in the local capture contract rather than the
repository or GitHub text.

After boot, record the guest values with an explicit emulator selector:

```sh
adb -s "$ANDROID_README_SERIAL" shell getprop ro.build.version.release
adb -s "$ANDROID_README_SERIAL" shell getprop ro.build.version.sdk
adb -s "$ANDROID_README_SERIAL" shell getprop ro.build.version.security_patch
adb -s "$ANDROID_README_SERIAL" shell wm size
adb -s "$ANDROID_README_SERIAL" shell wm density
```

Never publish emulator selectors, AVD names, local paths, usernames, IP
addresses, or other machine identifiers.

## Build a deterministic showcase fixture

Launch the Activity before injecting process-local state. Prefer existing debug
hooks. If they cannot express the composition, add the smallest temporary
command under:

```text
app/src/debug/java/com/bitchat/android/testhook/
```

The fixture should:

- use synthetic names, peer IDs, message IDs, and copy;
- use the real local mesh peer ID for self-authored messages;
- use a fixed epoch so timestamps and ordering are stable;
- insert records in the exact requested chronology;
- report structured counts through the test-hook result file;
- copy capture-only media into the app's cache or files directory;
- populate only the peers and state needed for the header;
- avoid persistence unless persistence itself is the subject.

For voice notes, route real audio files through the app's waveform extractor.
Use short, distinct, locally synthesized speech clips or other rights-safe
speech audio. Never draw a decorative waveform and call it speech. Wait for
asynchronous decoding before capture, then inspect that pauses and syllable
envelopes look plausibly different between notes.

For image attachments, use a rights-safe existing asset or an explicitly
approved synthetic source. Keep fixture media outside production source sets
and remove every capture-only hook before committing. Compose image rows may
remember a decoded bitmap by file path. After replacing the bytes at an
unchanged path, relaunch the app or use a new destination path before judging
the revised crop.

## Capture from the real app

Build and install the ABI-matching debug APK, satisfy onboarding and
permissions, inject the fixture, and navigate to the intended surface.

Capture directly:

```sh
adb -s "$ANDROID_README_SERIAL" exec-out screencap -p > "$ARTIFACT_PATH"
```

Inspect the full screenshot immediately. Check message count and order,
nickname ownership, peer count, waveform variety, image visibility, globe
center, grid precision, clipping, and composer placement.

Inject a complete timeline in one operation and allow at least two seconds of
quiet UI time after the fixture reports success. This avoids capturing entry
animations, incomplete placement, or media that has not finished decoding.

Crop only Android system chrome. Preserve Bitchat's app header, translucent
overlap, content, and composer. Derive the crop from the observed status and
navigation insets; do not blindly reuse pixel offsets from a different profile.
Because the app renders edge-to-edge, app controls may extend into the reported
navigation inset. Place the bottom crop after the final control outline and
shadow but before the system gesture affordance; removing the entire inset can
clip the app itself.
Keep every final README screenshot in a matched portrait size.

Use image inspection after the crop. File dimensions and a successful ADB
command do not prove that the desired composition is visible.

## Update repository assets

Discover the current README references before writing. Prefer stable paths under
`docs/screenshots/` and replace only the assets the user requested.

When adding a showcase section:

- keep the layout readable on GitHub;
- give every image meaningful alt text;
- use relative repository paths;
- avoid machine-generated cache files or capture sources;
- keep paired screenshots at identical dimensions.

Run the bundled validator for every final asset:

```sh
python3 \
.agents/skills/android-readme-screenshot-studio/scripts/validate_readme_screenshots.py \
--repo-root . \
--readme README.md \
--require-same-size \
--asset docs/screenshots/readme-mesh-chat.png \
--asset docs/screenshots/readme-geohash-globe.png
```

When replacing only one image in an existing pair, pass both the changed and
unchanged assets with `--require-same-size`, and verify the unchanged asset's
checksum. Pass only one asset and omit `--require-same-size` only when the
README has no paired screenshot to preserve.

## Remove the fixture and verify cleanly

Before committing:

1. Remove temporary imports, commands, helpers, resources, and fixture media
with a focused patch.
2. Verify `git diff -- app/src/debug` is empty.
3. Verify `git status --short` lists only the intended README and screenshot
files.
4. Run `git diff --check`.
5. Run `./gradlew assembleDebug` after fixture removal.
6. Re-run the screenshot validator.
7. Confirm the user's original checkout is still untouched.

The final commit must not contain synthetic peer data, generated photo sources,
audio clips, ADB outputs, emulator configuration, or local capture reports
unless the user separately requested those artifacts in the repository.

## Record honest evidence

Use the capture manifest and report format from
`../android-ui-visual-review/` when before/after evidence is useful. For a
README-only change with no production UI delta, identical before/after images
are acceptable when explicitly labeled “no production UI delta.”

State limitations plainly:

- a populated mesh timeline proves rendering, not physical message delivery;
- a voice row proves waveform rendering, not audio playback;
- an attachment proves image rendering, not media transfer;
- a globe proves picker state, not live location or relay behavior.

## Commit, publish, and optionally merge

GitHub writes require user authorization. When authorized:

1. Stage only intended files.
2. Commit without overriding author or committer identity.
3. Push the `codex/` branch.
4. Use `gh pr create` or update the existing PR.
5. Describe the exact capture sequence, synthetic fixture disclosure,
repository-safe validation commands, and limitations. Keep emulator,
runtime, hardware, and local-environment facts out of GitHub text whenever
repository privacy rules classify them as machine identifiers.
6. Verify the PR head and checks with `gh pr view` and `gh pr checks`.
7. Merge only when the user explicitly requested it and required checks allow
it. Prefer the repository's normal merge strategy and use `gh`.
8. Verify the merged state and resulting `main` commit.

When GitHub publication is not authorized, leave the finished commit or local
change in the isolated worktree and hand back its branch and artifact paths.
Do not silently push it.

Do not place local paths, device selectors, generated-image paths, or personal
machine details in commits, PR text, comments, or merge messages.

## Final handoff

Lead with the outcome and include:

- PR and merge URL or status;
- final screenshot paths and dimensions;
- one-line composition summary per surface;
- build and validator results;
- synthetic media disclosure;
- current CI state or merged commit;
- confirmation that the original checkout was not modified.
59 changes: 59 additions & 0 deletions .agents/skills/android-readme-screenshot-studio/evals/evals.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
{
"skill_name": "android-readme-screenshot-studio",
"evals": [
{
"id": 1,
"prompt": "Refresh the Bitchat README with two polished screenshots from the latest main UI: a populated mesh chat and the geohash globe centered on the Middle East without zooming. Use a large high-resolution Android emulator, open a PR, and merge it after checks pass.",
"expected_output": "The agent works in a fresh latest-main worktree, tries the documented current-pair fast path before rediscovering the fixture, captures the real app on a verified large portrait emulator profile, uses deterministic synthetic state, centers the globe without changing whole-Earth scale, removes capture hooks, validates the assets, opens a PR, waits for checks, and merges only because the prompt explicitly authorizes it.",
"files": [],
"expectations": [
"Uses a fresh worktree rooted at current origin/main and leaves the original checkout untouched.",
"Captures from the real Android UI on a verified high-resolution portrait emulator profile.",
"Uses the verified nine-row chat fixture and synthetic thky globe seed as fast starting points when the current UI still matches, while visually validating the result.",
"Waits for fixture completion and quiet UI time, and invalidates the media path cache when replacing image bytes at the same destination.",
"Keeps the requested Middle East focus while preserving whole-Earth zoom.",
"Removes temporary fixtures and passes a clean debug build before committing.",
"Uses gh for the authorized PR and merge without publishing machine identifiers."
]
},
{
"id": 2,
"prompt": "Replace only the README chat image. It should read top to bottom as: a photo, four short messages back and forth, three voice messages back and forth, then one thumbs-up. Keep the current globe exactly as-is and make the speech waveforms look natural.",
"expected_output": "The agent treats the requested order and counts as exact, asks or resolves the photo subject instead of inventing it, uses the real waveform extractor on three distinct speech clips, preserves the globe asset, visually inspects the final crop, and leaves only the chat PNG changed.",
"files": [],
"expectations": [
"Implements exactly one photo, four alternating texts, three alternating voice notes, and one final thumbs-up.",
"Does not infer a photo subject from nicknames or unrelated fixture copy.",
"Produces waveforms from real rights-safe speech audio through the app extractor rather than drawing bars.",
"Preserves the globe asset and verifies that only the chat screenshot remains in the diff.",
"Removes the debug fixture before the final clean build."
]
},
{
"id": 3,
"prompt": "Show me before and after screenshots for the Compose header changes in PR #412 at 320 dp and 411 dp, and post the comparison as a PR comment.",
"expected_output": "The agent recognizes that this is visual regression evidence rather than README marketing capture and routes the task to android-ui-visual-review instead of applying the README screenshot workflow.",
"files": [],
"expectations": [
"Routes the request to android-ui-visual-review.",
"Does not replace README assets.",
"Uses the PR merge-base and paired before/after capture workflow.",
"Publishes only the requested PR comment rather than opening an unrelated screenshot PR."
]
},
{
"id": 4,
"prompt": "The bottom of one or both README showcase screenshots is cropped. Correct the images without changing their content, update the screenshot skill so this does not recur, and open a new PR.",
"expected_output": "The agent inspects both merged assets at full size, identifies every affected screen, recaptures from the real app with the existing deterministic fixtures, and treats the navigation inset as an inspection region rather than an automatic crop. The final crop preserves complete app controls while excluding the system gesture affordance, keeps the pair matched, adds a reusable edge-to-edge guardrail to the skill, validates and visually inspects both images, and opens a sanitized PR.",
"files": [],
"expectations": [
"Inspects both screenshots and corrects every affected asset rather than assuming only one is cropped.",
"Recaptures the real app with the established deterministic synthetic content instead of padding or compositing the merged PNGs.",
"Uses accessibility bounds and full-size pixel inspection to place the bottom crop after complete app controls and before system gesture chrome.",
"Verifies the entire chat composer border and bottom padding plus every globe action-button corner and shadow are visible.",
"Keeps paired screenshots at identical dimensions and passes the screenshot validator and clean debug build.",
"Updates the skill with a general edge-to-edge crop rule and publishes no device or machine identifiers."
]
}
]
}
Loading
Loading