diff --git a/README.md b/README.md index 9149eb6dd..4faff260a 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ height="70">](https://github.com/vitorpamplona/amethyst/releases) - [x] HTTP File Storage Integration (NIP-96 Draft) - [x] HTTP Auth (NIP-98) - [x] Classifieds (NIP-99) -- [x] Private Messages and Small Groups (NIP-24/Draft) +- [x] Private Messages and Small Groups (NIP-17/Draft) - [x] Versioned Encrypted Payloads (NIP-44/Draft) - [x] Audio Tracks (zapstr.live) (kind:31337) - [x] Push Notifications (Google and Unified Push) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index c613cc004..19a952ef7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -91,7 +91,7 @@ private object PrefKeys { const val LATEST_CONTACT_LIST = "latestContactList" const val HIDE_DELETE_REQUEST_DIALOG = "hide_delete_request_dialog" const val HIDE_BLOCK_ALERT_DIALOG = "hide_block_alert_dialog" - const val HIDE_NIP_24_WARNING_DIALOG = "hide_nip24_warning_dialog" + const val HIDE_NIP_17_WARNING_DIALOG = "hide_nip24_warning_dialog" // delete later const val USE_PROXY = "use_proxy" const val PROXY_PORT = "proxy_port" const val SHOW_SENSITIVE_CONTENT = "show_sensitive_content" @@ -318,7 +318,7 @@ object LocalPreferences { Event.mapper.writeValueAsString(account.backupContactList), ) putBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, account.hideDeleteRequestDialog) - putBoolean(PrefKeys.HIDE_NIP_24_WARNING_DIALOG, account.hideNIP24WarningDialog) + putBoolean(PrefKeys.HIDE_NIP_17_WARNING_DIALOG, account.hideNIP17WarningDialog) putBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, account.hideBlockAlertDialog) putBoolean(PrefKeys.USE_PROXY, account.proxy != null) putInt(PrefKeys.PROXY_PORT, account.proxyPort) @@ -526,7 +526,7 @@ object LocalPreferences { val hideDeleteRequestDialog = getBoolean(PrefKeys.HIDE_DELETE_REQUEST_DIALOG, false) val hideBlockAlertDialog = getBoolean(PrefKeys.HIDE_BLOCK_ALERT_DIALOG, false) - val hideNIP24WarningDialog = getBoolean(PrefKeys.HIDE_NIP_24_WARNING_DIALOG, false) + val hideNIP17WarningDialog = getBoolean(PrefKeys.HIDE_NIP_17_WARNING_DIALOG, false) val useProxy = getBoolean(PrefKeys.USE_PROXY, false) val proxyPort = getInt(PrefKeys.PROXY_PORT, 9050) val proxy = HttpClientManager.initProxy(useProxy, "127.0.0.1", proxyPort) @@ -591,7 +591,7 @@ object LocalPreferences { zapPaymentRequest = zapPaymentRequestServer, hideDeleteRequestDialog = hideDeleteRequestDialog, hideBlockAlertDialog = hideBlockAlertDialog, - hideNIP24WarningDialog = hideNIP24WarningDialog, + hideNIP17WarningDialog = hideNIP17WarningDialog, backupContactList = latestContactList, proxy = proxy, proxyPort = proxyPort, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 12072b1fe..9e50eeb8f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -78,7 +78,7 @@ import com.vitorpamplona.quartz.events.LnZapPaymentResponseEvent import com.vitorpamplona.quartz.events.LnZapRequestEvent import com.vitorpamplona.quartz.events.MetadataEvent import com.vitorpamplona.quartz.events.MuteListEvent -import com.vitorpamplona.quartz.events.NIP24Factory +import com.vitorpamplona.quartz.events.NIP17Factory import com.vitorpamplona.quartz.events.OtsEvent import com.vitorpamplona.quartz.events.PeopleListEvent import com.vitorpamplona.quartz.events.PollNoteEvent @@ -185,7 +185,7 @@ class Account( var zapPaymentRequest: Nip47WalletConnect.Nip47URI? = null, var hideDeleteRequestDialog: Boolean = false, var hideBlockAlertDialog: Boolean = false, - var hideNIP24WarningDialog: Boolean = false, + var hideNIP17WarningDialog: Boolean = false, var backupContactList: ContactListEvent? = null, var proxy: Proxy? = null, var proxyPort: Int = 9050, @@ -593,7 +593,7 @@ class Account( val emojiUrl = EmojiUrl.decode(reaction) if (emojiUrl != null) { note.event?.let { - NIP24Factory().createReactionWithinGroup( + NIP17Factory().createReactionWithinGroup( emojiUrl = emojiUrl, originalNote = it, to = users, @@ -608,7 +608,7 @@ class Account( } note.event?.let { - NIP24Factory().createReactionWithinGroup( + NIP17Factory().createReactionWithinGroup( content = reaction, originalNote = it, to = users, @@ -1736,7 +1736,7 @@ class Account( } } - fun sendNIP24PrivateMessage( + fun sendNIP17PrivateMessage( message: String, toUsers: List, subject: String? = null, @@ -1754,7 +1754,7 @@ class Account( val repliesToHex = listOfNotNull(replyingTo?.idHex).ifEmpty { null } val mentionsHex = mentions?.map { it.pubkeyHex } - NIP24Factory().createMsgNIP24( + NIP17Factory().createMsgNIP17( msg = message, to = toUsers, subject = subject, @@ -1783,7 +1783,7 @@ class Account( } } - fun broadcastPrivately(signedEvents: NIP24Factory.Result) { + fun broadcastPrivately(signedEvents: NIP17Factory.Result) { val mine = signedEvents.wraps.filter { (it.recipientPubKey() == signer.pubKey) } mine.forEach { giftWrap -> @@ -2538,8 +2538,8 @@ class Account( saveable.invalidateData() } - fun setHideNIP24WarningDialog() { - hideNIP24WarningDialog = true + fun setHideNIP17WarningDialog() { + hideNIP17WarningDialog = true saveable.invalidateData() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index 1f7a19f38..b94583a54 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -92,7 +92,7 @@ open class NewPostViewModel() : ViewModel() { var accountViewModel: AccountViewModel? = null var account: Account? = null - var requiresNIP24: Boolean = false + var requiresNIP17: Boolean = false var originalNote: Note? = null var forkedFromNote: Note? = null @@ -169,8 +169,8 @@ open class NewPostViewModel() : ViewModel() { var wantsZapraiser by mutableStateOf(false) var zapRaiserAmount by mutableStateOf(null) - // NIP24 Wrapped DMs / Group messages - var nip24 by mutableStateOf(false) + // NIP17 Wrapped DMs / Group messages + var nip17 by mutableStateOf(false) val draftTextChanges = Channel(Channel.CONFLATED) @@ -425,8 +425,8 @@ open class NewPostViewModel() : ViewModel() { TextFieldValue(draftEvent.content()) } - requiresNIP24 = draftEvent is ChatMessageEvent - nip24 = draftEvent is ChatMessageEvent + requiresNIP17 = draftEvent is ChatMessageEvent + nip17 = draftEvent is ChatMessageEvent if (draftEvent is ChatMessageEvent) { toUsers = @@ -557,7 +557,7 @@ open class NewPostViewModel() : ViewModel() { .toSet() .toList() - account?.sendNIP24PrivateMessage( + account?.sendNIP17PrivateMessage( message = tagger.message, toUsers = receivers, subject = subject.text.ifBlank { null }, @@ -571,8 +571,8 @@ open class NewPostViewModel() : ViewModel() { draftTag = localDraft, ) } else if (!dmUsers.isNullOrEmpty()) { - if (nip24 || dmUsers.size > 1) { - account?.sendNIP24PrivateMessage( + if (nip17 || dmUsers.size > 1) { + account?.sendNIP17PrivateMessage( message = tagger.message, toUsers = dmUsers.map { it.pubkeyHex }, subject = subject.text.ifBlank { null }, @@ -1131,10 +1131,10 @@ open class NewPostViewModel() : ViewModel() { } fun toggleNIP04And24() { - if (requiresNIP24) { - nip24 = true + if (requiresNIP17) { + nip17 = true } else { - nip24 = !nip24 + nip17 = !nip17 } if (message.text.isNotBlank()) { saveDraft() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt index 4fedfa8f0..498e1969a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -666,11 +666,11 @@ class AccountViewModel(val account: Account, val settings: SettingsState) : View viewModelScope.launch(Dispatchers.IO) { account.setHideDeleteRequestDialog() } } - val hideNIP24WarningDialog: Boolean - get() = account.hideNIP24WarningDialog + val hideNIP17WarningDialog: Boolean + get() = account.hideNIP17WarningDialog - fun dontShowNIP24WarningDialog() { - account.setHideNIP24WarningDialog() + fun dontShowNIP17WarningDialog() { + account.setHideNIP17WarningDialog() } val hideBlockAlertDialog: Boolean diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt index cc3772965..49485b8f7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt @@ -122,7 +122,6 @@ import com.vitorpamplona.quartz.events.findURLs import kotlinx.collections.immutable.persistentSetOf import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.receiveAsFlow @@ -210,7 +209,6 @@ fun LoadRoomByAuthor( content(room) } -@OptIn(FlowPreview::class) @Composable fun PrepareChatroomViewModels( room: ChatroomKey, @@ -231,23 +229,8 @@ fun PrepareChatroomViewModels( val newPostModel: NewPostViewModel = viewModel() newPostModel.accountViewModel = accountViewModel newPostModel.account = accountViewModel.account - newPostModel.requiresNIP24 = room.users.size > 1 - if (newPostModel.requiresNIP24) { - newPostModel.nip24 = true - } - - LaunchedEffect(key1 = newPostModel) { - launch(Dispatchers.IO) { - val hasNIP24 = - accountViewModel.userProfile().privateChatrooms[room]?.roomMessages?.any { - it.event is ChatMessageEvent && - (it.event as ChatMessageEvent).pubKey != accountViewModel.userProfile().pubkeyHex - } - if (hasNIP24 == true && newPostModel.nip24 == false) { - newPostModel.nip24 = true - } - } - } + newPostModel.requiresNIP17 = room.users.size > 1 + newPostModel.nip17 = true // defaults to the new GiftWrap if (draftMessage != null) { LaunchedEffect(key1 = draftMessage) { newPostModel.message = TextFieldValue(draftMessage) } @@ -373,8 +356,8 @@ private fun innerSendPost( val urls = findURLs(newPostModel.message.text) val usedAttachments = newPostModel.nip94attachments.filter { it.urls().intersect(urls.toSet()).isNotEmpty() } - if (newPostModel.nip24 || room.users.size > 1 || replyTo.value?.event is ChatMessageEvent) { - accountViewModel.account.sendNIP24PrivateMessage( + if (newPostModel.nip17 || room.users.size > 1 || replyTo.value?.event is ChatMessageEvent) { + accountViewModel.account.sendNIP17PrivateMessage( message = newPostModel.message.text, toUsers = room.users.toList(), replyingTo = replyTo.value, @@ -454,13 +437,13 @@ fun PrivateMessageEditFieldRow( ) } - var wantsToActivateNIP24 by remember { mutableStateOf(false) } + var wantsToActivateNIP17 by remember { mutableStateOf(false) } - if (wantsToActivateNIP24) { - NewFeatureNIP24AlertDialog( + if (wantsToActivateNIP17) { + NewFeatureNIP17AlertDialog( accountViewModel = accountViewModel, onConfirm = { channelScreenModel.toggleNIP04And24() }, - onDismiss = { wantsToActivateNIP24 = false }, + onDismiss = { wantsToActivateNIP17 = false }, ) } @@ -468,17 +451,17 @@ fun PrivateMessageEditFieldRow( modifier = Size30Modifier, onClick = { if ( - !accountViewModel.hideNIP24WarningDialog && - !channelScreenModel.nip24 && - !channelScreenModel.requiresNIP24 + !accountViewModel.hideNIP17WarningDialog && + !channelScreenModel.nip17 && + !channelScreenModel.requiresNIP17 ) { - wantsToActivateNIP24 = true + wantsToActivateNIP17 = true } else { channelScreenModel.toggleNIP04And24() } }, ) { - if (channelScreenModel.nip24) { + if (channelScreenModel.nip17) { IncognitoIconOn( modifier = Modifier @@ -537,7 +520,7 @@ fun ShowUserSuggestionList( } @Composable -fun NewFeatureNIP24AlertDialog( +fun NewFeatureNIP17AlertDialog( accountViewModel: AccountViewModel, onConfirm: () -> Unit, onDismiss: () -> Unit, @@ -545,10 +528,10 @@ fun NewFeatureNIP24AlertDialog( val scope = rememberCoroutineScope() QuickActionAlertDialog( - title = stringResource(R.string.new_feature_nip24_might_not_be_available_title), - textContent = stringResource(R.string.new_feature_nip24_might_not_be_available_description), + title = stringResource(R.string.new_feature_nip17_might_not_be_available_title), + textContent = stringResource(R.string.new_feature_nip17_might_not_be_available_description), buttonIconResource = R.drawable.incognito, - buttonText = stringResource(R.string.new_feature_nip24_activate), + buttonText = stringResource(R.string.new_feature_nip17_activate), onClickDoOnce = { scope.launch(Dispatchers.IO) { onConfirm() } onDismiss() @@ -556,7 +539,7 @@ fun NewFeatureNIP24AlertDialog( onClickDontShowAgain = { scope.launch(Dispatchers.IO) { onConfirm() - accountViewModel.dontShowNIP24WarningDialog() + accountViewModel.dontShowNIP17WarningDialog() } onDismiss() }, @@ -732,7 +715,7 @@ fun NewSubjectView( PostButton( onPost = { scope.launch(Dispatchers.IO) { - accountViewModel.account.sendNIP24PrivateMessage( + accountViewModel.account.sendNIP17PrivateMessage( message = message.value, toUsers = room.users.toList(), subject = groupName.value.ifBlank { null }, diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 68a24913d..8060e9ecd 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -410,11 +410,11 @@ الافتراضي اختر مرحل للإستمرار عرض الموقع كـ - ميزة جديدة - يتطلب تنشيط هذا الوضع من Amethyst إرسال رسالة خاصة من نوع NIP-24 + ميزة جديدة + يتطلب تنشيط هذا الوضع من Amethyst إرسال رسالة خاصة من نوع NIP-17 (GiftWrapped, Sealed Direct and group Messages) . -إضافة NIP-24 لا تزال جديدة ومعظم العملاء لم يدعموها بعد. تأكد من أن المستلم يستخدم عميل متوافق. - تفعيل +إضافة NIP-17 لا تزال جديدة ومعظم العملاء لم يدعموها بعد. تأكد من أن المستلم يستخدم عميل متوافق. + تفعيل عام خاص إلى @@ -440,7 +440,7 @@ خطأ أثناء تحليل رسالة المشكل رسالة إلى المستخدم موافق - فشل الوصول إلى + فشل الوصول إلى %1$s: %2$s الصفحة الرئيسية البحث diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 340c74197..e0398a9f7 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -436,9 +436,9 @@ আপনার অবস্থান এভাবে প্রকাশ করুন পোস্টে আপনার অবস্থানের একটি জিওহ্যাশ যোগ করে। জনসাধারণ জানবে যে আপনি বর্তমান অবস্থান থেকে ৫ কিলোমিটার (৩ মাইল) এর মধ্যে আছেন আপনার পেশকৃত আধেয় দেখানোর আগে সংবেদনশীল আধেয়-সতর্কতা জারি করে। এটি সেসকল আধেয়র জন্য আদর্শ যেখানে NSFW উপাদান কিংবা এমনকিছু থাকতে পারে যা কারো কারো জন্য আপত্তিকর কিংবা সমস্যাজনক মনে হতে পারে। - নতুন ফিচার - এই মোড সক্রিয় করার জন্য অ্যামেথিস্টকে একটি NIP-24 বার্তা পাঠাতে হবে। (GiftWrapped, সিল করা সরাসরি এবং দলগত বার্তা)। NIP-24 নতুন এবং বেশিরভাগ ক্লায়েন্ট এখনও এটি বাস্তবায়ন করেনি। নিশ্চিত করুন যে প্রাপক একটি সামঞ্জস্যপূর্ণ ক্লায়েন্ট ব্যবহার করছে। - সক্রিয় করুন + নতুন ফিচার + এই মোড সক্রিয় করার জন্য অ্যামেথিস্টকে একটি NIP-17 বার্তা পাঠাতে হবে। (GiftWrapped, সিল করা সরাসরি এবং দলগত বার্তা)। NIP-17 নতুন এবং বেশিরভাগ ক্লায়েন্ট এখনও এটি বাস্তবায়ন করেনি। নিশ্চিত করুন যে প্রাপক একটি সামঞ্জস্যপূর্ণ ক্লায়েন্ট ব্যবহার করছে। + সক্রিয় করুন সর্বজনীন ব্যক্তিগত প্রতি diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index e2f040297..933bf46c6 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -471,9 +471,9 @@ Zveřejnit polohu jako Přidá Geohash vaší polohy do příspěvku. Veřejnost bude vědět, že se nacházíte do 5 km od aktuální polohy Přidat varování o citlivém obsahu před zobrazením vašeho obsahu. Toto je ideální pro obsah NSFW (nebezpečné pro práci) nebo obsah, který někteří lidé mohou považovat za urážlivý nebo znepokojující - Nová funkce - Aktivace tohoto režimu vyžaduje od Amethystu odeslání zprávy NIP-24 (GiftWrapped, Zapečetěné přímé a skupinové zprávy). NIP-24 je nový a většina klientů ho zatím neimplementovala. Ujistěte se, že příjemce používá kompatibilního klienta. - Aktivovat + Nová funkce + Aktivace tohoto režimu vyžaduje od Amethystu odeslání zprávy NIP-17 (GiftWrapped, Zapečetěné přímé a skupinové zprávy). NIP-17 je nový a většina klientů ho zatím neimplementovala. Ujistěte se, že příjemce používá kompatibilního klienta. + Aktivovat Veřejné Nová veřejná nebo soukromá skupina Soukromé diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 23710cb24..56522625a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -476,9 +476,9 @@ anz der Bedingungen ist erforderlich Ort preisgeben als Fügt dem Beitrag einen Geohash Ihres Standorts hinzu. Die Öffentlichkeit wird wissen, dass Sie sich innerhalb von 5 km (3 mi) vom aktuellen Standort befinden Fügt eine Warnung für sensiblen Inhalt hinzu, bevor Ihr Inhalt angezeigt wird. Dies ist ideal für NSFW-Inhalte (nicht sicher für die Arbeit) oder Inhalte, die manche Menschen als anstößig oder verstörend empfinden könnten - Neues Feature - Um diesen Modus zu aktivieren, muss Amethyst eine NIP-24-Nachricht senden (GiftWrapped, Versiegelte Direkt- und Gruppennachrichten). NIP-24 ist neu und die meisten Clients haben es noch nicht implementiert. Stellen Sie sicher, dass der Empfänger einen kompatiblen Client verwendet. - Aktivieren + Neues Feature + Um diesen Modus zu aktivieren, muss Amethyst eine NIP-17-Nachricht senden (GiftWrapped, Versiegelte Direkt- und Gruppennachrichten). NIP-17 ist neu und die meisten Clients haben es noch nicht implementiert. Stellen Sie sicher, dass der Empfänger einen kompatiblen Client verwendet. + Aktivieren Öffentlich Neue öffentliche oder private Gruppe Privat diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml index 8cd59e916..7da6e93a1 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -429,9 +429,9 @@ Εμφάνιση τοποθεσίας ως Προσθέτει ένα Geohash (γεωγραφικό στίγμα) της τοποθεσίας σας στη δημοσίευση. Το κοινό θα γνωρίζει ότι βρίσκεστε σε απόσταση 5km (3μίλια) από την τρέχουσα τοποθεσία Προσθέτει μια προειδοποίηση ευαίσθητου περιεχομένου πριν εμφανίσει τη δημοσίευσή σας. Ιδανικό για δημοσίευση με περιεχόμενο NSFW ή περιεχόμενο που κάποια άτομα μπορεί να βρουν προσβλητικό ή ενοχλητικό - Νέα Λειτουργία - Η ενεργοποίηση αυτής της λειτουργίας απαιτεί από το Amethyst να στείλει ένα μήνυμα NIP-24 (GiftWrapped, Sealed Direct και Group Messages). Το NIP-24 είναι νέο και οι περισσότεροι clients δεν το έχουν υιοθετήσει ακόμα. Βεβαιωθείτε ότι ο αποδέκτης χρησιμοποιεί έναν συμβατό client. - Ενεργοποίηση + Νέα Λειτουργία + Η ενεργοποίηση αυτής της λειτουργίας απαιτεί από το Amethyst να στείλει ένα μήνυμα NIP-17 (GiftWrapped, Sealed Direct και Group Messages). Το NIP-17 είναι νέο και οι περισσότεροι clients δεν το έχουν υιοθετήσει ακόμα. Βεβαιωθείτε ότι ο αποδέκτης χρησιμοποιεί έναν συμβατό client. + Ενεργοποίηση Δημόσια Ιδιωτικό Προς diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 90b23a36d..d305e342c 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -419,9 +419,9 @@ Montri Loko kiel Aldonas Geohash de via loko al la afiŝo. La aŭdienco scios kiam vi estas je 5km (3mi) de la nuna loko Aldonas averton de delikata enhavo antaŭ ol montri vian enhavon. Ĉi tiu estas perfekta por NSFW enhavo aŭ enhavo kiun iu povas trovi ofensiva aŭ ĝena - Nova Trajto - Por aktivigi ĉi tiun reĝimon Amethyst devus sendi NIP-24 mesaĝon (GiftWrapped, Sealed Direct kaj Grupa Mesaĝojn). NIP-24 estas nova kaj la plejparto de klientoj ankoraŭ ne instalis ĝin. Konfirmu ke la ricevanto uzas kongruan klienton. - Aktivigi + Nova Trajto + Por aktivigi ĉi tiun reĝimon Amethyst devus sendi NIP-17 mesaĝon (GiftWrapped, Sealed Direct kaj Grupa Mesaĝojn). NIP-17 estas nova kaj la plejparto de klientoj ankoraŭ ne instalis ĝin. Konfirmu ke la ricevanto uzas kongruan klienton. + Aktivigi Publika Privata Al diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 6ac2d1374..3518e9c85 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -473,9 +473,9 @@ Revelar ubicación como Agrega un Geohash de tu ubicación al mensaje. El público sabrá que te encuentras a menos de 5 km (3 mi) de la ubicación actual. Agrega una advertencia de contenido delicado antes de mostrarlo. Esto es ideal para cualquier contenido NSFW o que a algunas personas les pueda resultar ofensivo o perturbador. - Función nueva - La activación de este modo requiere que Amethyst envíe un mensaje NIP-24 (mensajes directos sellados, de grupo y “GiftWrapped\"). NIP-24 es nuevo y la mayoría de los clientes aún no lo han implementado. Comprueba que el destinatario use un cliente compatible. - Activar + Función nueva + La activación de este modo requiere que Amethyst envíe un mensaje NIP-17 (mensajes directos sellados, de grupo y “GiftWrapped\"). NIP-17 es nuevo y la mayoría de los clientes aún no lo han implementado. Comprueba que el destinatario use un cliente compatible. + Activar Público Nuevo grupo público o privado Privado diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index 446ccf31f..c09d71c39 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -473,9 +473,9 @@ Revelar ubicación como Agrega un Geohash de tu ubicación al mensaje. El público sabrá que te encuentras a menos de 5 km (3 mi) de la ubicación actual. Agrega una advertencia de contenido delicado antes de mostrarlo. Esto es ideal para cualquier contenido NSFW o que a algunas personas les pueda resultar ofensivo o perturbador. - Función nueva - La activación de este modo requiere que Amethyst envíe un mensaje NIP-24 (mensajes directos sellados, de grupo y “GiftWrapped\"). NIP-24 es nuevo y la mayoría de los clientes aún no lo han implementado. Comprueba que el destinatario use un cliente compatible. - Activar + Función nueva + La activación de este modo requiere que Amethyst envíe un mensaje NIP-17 (mensajes directos sellados, de grupo y “GiftWrapped\"). NIP-17 es nuevo y la mayoría de los clientes aún no lo han implementado. Comprueba que el destinatario use un cliente compatible. + Activar Público Nuevo grupo público o privado Privado diff --git a/app/src/main/res/values-es-rUS/strings.xml b/app/src/main/res/values-es-rUS/strings.xml index a49636179..8853a7798 100644 --- a/app/src/main/res/values-es-rUS/strings.xml +++ b/app/src/main/res/values-es-rUS/strings.xml @@ -473,9 +473,9 @@ Revelar ubicación como Agrega un Geohash de tu ubicación al mensaje. El público sabrá que te encuentras a menos de 5 km (3 mi) de la ubicación actual. Agrega una advertencia de contenido delicado antes de mostrarlo. Esto es ideal para cualquier contenido NSFW o que a algunas personas les pueda resultar ofensivo o perturbador. - Función nueva - La activación de este modo requiere que Amethyst envíe un mensaje NIP-24 (mensajes directos sellados, de grupo y “GiftWrapped\"). NIP-24 es nuevo y la mayoría de los clientes aún no lo han implementado. Comprueba que el destinatario use un cliente compatible. - Activar + Función nueva + La activación de este modo requiere que Amethyst envíe un mensaje NIP-17 (mensajes directos sellados, de grupo y “GiftWrapped\"). NIP-17 es nuevo y la mayoría de los clientes aún no lo han implementado. Comprueba que el destinatario use un cliente compatible. + Activar Público Nuevo grupo público o privado Privado diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index ac0627933..ad7098991 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -326,7 +326,7 @@ \n\n1. نصب کنید [Orbot](https://play.google.com/store/apps/details?id=org.torproject.android) \n2. شروع Orbot \n3. در Orbot, پورت Socksرا علامت بزنید.مقدار پیش فرض 9050 است. - \n4. اگر لازم است پورت Orbot را تغییر دهید + \n4. اگر لازم است پورت Orbot را تغییر دهید \n5. پورت Socks را در این صفحه پیکربندی کنید \n6. دکمه Activate را بفشارید تا از Orbot به عنوان پراکسی استفده نمایید @@ -443,9 +443,9 @@ افشای مکان به عنوان یک از مکان شما به این بادداشت می افزاید. دیگران خواهند دانست که شما در فاصله 5 کیلومتری (3 مایلی) این مکان هستید. پیش از نمایش محتوای شما، هشدار محتوای حساس به آن می افزاید. این برای هرگونه محتوای نامناسب برای محیط کار یا هر محتوای دیگری که برخی ممکن است توهین آمیز یا مشوش کننده بدانند خوب است. - ویژگی جدید - برای فعال سازی این حالت لازم است اماتیست یک پیغام NIP-24 بفرستد (پیغام های GiftWrapped, Sealed Direct and Group). مطمئن شوید که گیرنده از کلاینتی سازگاز استفاده می کند. - فعال‌سازی + ویژگی جدید + برای فعال سازی این حالت لازم است اماتیست یک پیغام NIP-17 بفرستد (پیغام های GiftWrapped, Sealed Direct and Group). مطمئن شوید که گیرنده از کلاینتی سازگاز استفاده می کند. + فعال‌سازی عمومی خصوصی به diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index 6b403d633..75f5bc608 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -434,9 +434,9 @@ Näytä sijaintina Lisää sijaintisi Geohashinä viestiin. On julkisesti nähtävänä, että olet 5 km (3 mailin) säteellä nykyisestä sijainnista Lisää herkkä sisältö -varoitus ennen sisällön näyttämistä. Tämä on suositeltua kaikelle aikuissisällölle tai sisällölle, jota jotkut saattavat pitää loukkaavana tai häiritsevänä - Uusi ominaisuus - Tämän tilan aktivoiminen vaatii Amethystin lähettämään NIP-24-viestin (Lahjapakatut, Suljetut suorat ja ryhmäviestit). NIP-24 on uusi, ja useimmat asiakkaat eivät ole vielä toteuttaneet sitä. Varmista, että vastaanottaja käyttää yhteensopivaa asiakasta. - Aktivoi + Uusi ominaisuus + Tämän tilan aktivoiminen vaatii Amethystin lähettämään NIP-17-viestin (Lahjapakatut, Suljetut suorat ja ryhmäviestit). NIP-17 on uusi, ja useimmat asiakkaat eivät ole vielä toteuttaneet sitä. Varmista, että vastaanottaja käyttää yhteensopivaa asiakasta. + Aktivoi Julkinen Yksityinen Vastaanottaja diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6bb68e174..dc2434451 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -473,9 +473,9 @@ Révéler la localisation comme Ajoute un Geohash de votre emplacement au message. Le public saura que vous êtes à moins de 5km de l\'emplacement actuel Ajoute un avertissement de contenu sensible avant de montrer votre contenu. C\'est idéal pour tout contenu NSFW ou contenu que certaines personnes peuvent trouver offensant ou dérangeant - Nouvelle Fonctionnalité - Pour activer ce mode, Amethyst doit envoyer un message NIP-24 (GiftWrapped, Sealed Direct et Group Messages). Le protocole NIP-24 est nouveau et la plupart des clients ne l\'ont pas encore mis en oeuvre. Assurez-vous que le destinataire utilise un client compatible. - Activer + Nouvelle Fonctionnalité + Pour activer ce mode, Amethyst doit envoyer un message NIP-17 (GiftWrapped, Sealed Direct et Group Messages). Le protocole NIP-17 est nouveau et la plupart des clients ne l\'ont pas encore mis en oeuvre. Assurez-vous que le destinataire utilise un client compatible. + Activer Public Nouveau Groupe Public ou Privé Privé diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index 0bdc405bd..cd82ea1b6 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -473,9 +473,9 @@ स्थान अनावृत करें ऐसे आपका भूगोलिक स्थान विभेदक जोडता है पत्र में। जनता जान जाएगी कि आप वर्तमान स्थान से ५ कि॰मे॰ (३ मी॰) की दूरी के अन्दर हैं आपके विषयवस्तु दिखाने से पूर्व संवेदनशील विषयवस्तु चेतावनी जोडता है। यह आदर्श है किसी कार्यालय अनुचित विषयवस्तु के लिए अथवा जो कुछ लोगों के लिए आपत्तिजनक अथवा व्याकुल करनेवाला लग सकता है - नयी सुविधा - इस कार्यशैली सक्षम करने के लिए अमेथिस्ट के द्वारा NIP-24 संदेश (उपहारकोषयुक्त, आच्छादित सीधा तथा झुण्ड संदेश) भेजना पडेगा। यह NIP-24 नया है तथा अनेक ग्राहक इसे कार्यान्वित किया नहीं अब तक। सुनिश्चित करें कि प्राप्तकर्ता एक अनुकूल ग्राहक का प्रयोग कर रहे हैं। - सक्रिय करें + नयी सुविधा + इस कार्यशैली सक्षम करने के लिए अमेथिस्ट के द्वारा NIP-17 संदेश (उपहारकोषयुक्त, आच्छादित सीधा तथा झुण्ड संदेश) भेजना पडेगा। यह NIP-17 नया है तथा अनेक ग्राहक इसे कार्यान्वित किया नहीं अब तक। सुनिश्चित करें कि प्राप्तकर्ता एक अनुकूल ग्राहक का प्रयोग कर रहे हैं। + सक्रिय करें सार्वजनिक नया निजी अथवा सार्वजनिक झुण्ड निजी diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 1739bec4f..3464a271a 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -472,9 +472,9 @@ A Hely megjelenítése mint A bejegyzéshez az Ön tartózkodási helyének Geohash-ét hozzáadja. A közönség tudni fogja, hogy az aktuális helytől 5 km-en (3 mérföldön) belül van A kényes tartalom miatt, azon megjelenítése előtt figyelmeztetést ad. Ez ideális minden Felnőtt tartalomhoz vagy olyan tartalomhoz, amelyet egyesek sértőnek vagy zavarónak találhatnak - Új funkció - Az Amethystnek ennek a módnak az aktiválásához NIP-24 üzenetet kell küldenie (GiftWrapped, Zárolt direkt és csoportos üzeneteket). A NIP-24 új, és a legtöbb kliens még nem implementálta. Győződj meg arról, hogy a fogadó fél kompatibilis klienst használ. - Aktiválás + Új funkció + Az Amethystnek ennek a módnak az aktiválásához NIP-17 üzenetet kell küldenie (GiftWrapped, Zárolt direkt és csoportos üzeneteket). A NIP-17 új, és a legtöbb kliens még nem implementálta. Győződj meg arról, hogy a fogadó fél kompatibilis klienst használ. + Aktiválás Publikus Új nyilvános vagy privát csoport Privát diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml index 70e72e198..fef2027fa 100644 --- a/app/src/main/res/values-in-rID/strings.xml +++ b/app/src/main/res/values-in-rID/strings.xml @@ -431,9 +431,9 @@ Beri tahu kepada pemilik untuk menambahnya Paparkan Lokasi sebagai Menambahkan Geohash lokasi Anda ke postingan. Publik akan mengetahui bahwa Anda berada dalam jarak 5 km (3 mil) dari lokasi saat ini Menambahkan peringatan konten sensitif sebelum menampilkan konten Anda. Ini berguna untuk konten NSFW apa pun atau konten yang mungkin dianggap menyinggung atau mengganggu oleh sebagian orang - Fitur Baru - Mengaktifkan mode ini mengharuskan Amethyst mengirim pesan NIP-24 (GiftWrapped, Sealed Direct, dan Group Messages). NIP-24 masih baru dan sebagian besar klien belum menerapkannya. Pastikan penerima menggunakan klien yang didukung. - Aktifkan + Fitur Baru + Mengaktifkan mode ini mengharuskan Amethyst mengirim pesan NIP-17 (GiftWrapped, Sealed Direct, dan Group Messages). NIP-17 masih baru dan sebagian besar klien belum menerapkannya. Pastikan penerima menggunakan klien yang didukung. + Aktifkan Publik Privat Ke @@ -516,7 +516,7 @@ Periksa pengaturan Lightning pengguna URL panggilan balik tidak ditemukan dalam konfigurasi server alamat Lightning Pengguna Tidak dapat mengurai JSON dari faktur alamat Lightning. Periksa pengaturan Lightning pengguna - Jumlah faktur salah (%1$s sat) dari %2$s. + Jumlah faktur salah (%1$s sat) dari %2$s. Seharusnya %3$s Tidak dapat membuat faktur Lightning sebelum mengirim zap. Dompet Lightning penerima mengirimkan kesalahan berikut: %1$s Tidak dapat membuat faktur Lightning sebelum mengirim zap. Elemen pr tidak ditemukan di JSON yang dihasilkan. diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 13ee2612a..edcb257e4 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -412,9 +412,9 @@ Paparkan Lokasi sebagai Menambahkan Geohash lokasi Anda ke postingan. Publik akan mengetahui bahwa Anda berada dalam jarak 5 km (3 mil) dari lokasi saat ini Menambahkan peringatan konten sensitif sebelum menampilkan konten Anda. Ini ideal untuk konten NSFW apa pun atau konten yang mungkin dianggap menyinggung atau mengganggu oleh sebagian orang - Fitur Baru - Mengaktifkan mode ini mengharuskan Amethyst mengirim pesan NIP-24 (GiftWrapped, Sealed Direct, dan Group Messages). NIP-24 masih baru dan sebagian besar klien belum menerapkannya. Pastikan penerima menggunakan klien yang kompatibel. - Aktifkan + Fitur Baru + Mengaktifkan mode ini mengharuskan Amethyst mengirim pesan NIP-17 (GiftWrapped, Sealed Direct, dan Group Messages). NIP-17 masih baru dan sebagian besar klien belum menerapkannya. Pastikan penerima menggunakan klien yang kompatibel. + Aktifkan Publik Pribadi Ke diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index abf7126ae..d418dd645 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -419,9 +419,9 @@ Esporre la posizione come Aggiunge un Geohash della tua posizione al post. Il pubblico saprà che ti trovi a 5 km dalla posizione attuale Aggiunge un avviso di contenuto sensibile prima di mostrare il tuo contenuto. Questo è ideale per qualsiasi contenuto NSFW o che alcune persone potrebbero trovare offensivo o disturbante - Nuova Funzionalità - Attivare questa modalità richiede ad Amethyst di inviare un messaggio NIP-24 (GiftWrapped, Sealed Direct e messaggi di gruppo). NIP-24 è nuovo e la maggior parte dei client non l\'hanno ancora implementato. Assicurarsi che il ricevitore stia utilizzando un client compatibile. - Attivare + Nuova Funzionalità + Attivare questa modalità richiede ad Amethyst di inviare un messaggio NIP-17 (GiftWrapped, Sealed Direct e messaggi di gruppo). NIP-17 è nuovo e la maggior parte dei client non l\'hanno ancora implementato. Assicurarsi che il ricevitore stia utilizzando un client compatibile. + Attivare Pubblico/a Privato A diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index fc16fd56f..483f597d3 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -473,9 +473,9 @@ Locatie weergeven als Voegt een Geohash van je locatie toe aan het bericht. Het publiek weet dat je binnen 5 km (3mi) van de huidige locatie bent. Voegt een waarschuwing voor gevoelige inhoud toe voordat je inhoud wordt weergegeven. Dit is ideaal voor NSFW-inhoud of inhoud die sommige mensen beledigend of verontrustend vinden. - Nieuwe functie - Voor het activeren van deze modus is Amethyst nodig om een NIP-24 bericht te versturen. NIP-24 is nieuw en de meeste clients hebben deze nog niet geïmplementeerd. Zorg ervoor dat de ontvanger een compatibele client gebruikt. - Activeren + Nieuwe functie + Voor het activeren van deze modus is Amethyst nodig om een NIP-17 bericht te versturen. NIP-17 is nieuw en de meeste clients hebben deze nog niet geïmplementeerd. Zorg ervoor dat de ontvanger een compatibele client gebruikt. + Activeren Publiek Nieuwe openbare of besloten groep Privé diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 81cf7a208..ab0a4428c 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -471,9 +471,9 @@ Expor localização como Adicione um geohash da sua localização à postagem. O público saberá que você está a 5 km (3 milhas) do local atual Adiciona aviso de conteúdo sensível antes de mostrar seu conteúdo. Isso é ideal para qualquer conteúdo NSFW ou conteúdo que algumas pessoas possam considerar ofensivo ou perturbador - Novo recurso - Ativando este modo requer o Amethyst para enviar uma mensagem de NIP-24 (GiftWrapped, Sealed Direct and Group Messages). NIP-24 é novo e a maioria dos clientes ainda não o implementaram. Certifique-se de que o destinatário está usando um cliente compatível. - Ativar + Novo recurso + Ativando este modo requer o Amethyst para enviar uma mensagem de NIP-17 (GiftWrapped, Sealed Direct and Group Messages). NIP-17 é novo e a maioria dos clientes ainda não o implementaram. Certifique-se de que o destinatário está usando um cliente compatível. + Ativar Público Novo Grupo Público ou Privado Privado diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 6ba78d4e4..ad1fd9ff4 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -470,9 +470,9 @@ Exponera plats som Lägger till en Geohash av din plats i inlägget. Allmänheten kommer att veta att du befinner dig inom 5 km från nuvarande plats Lägger till en varning för känsligt innehåll innan ditt innehåll visas. Detta är idealiskt för NSFW-innehåll (inte säkert för arbete) eller innehåll som vissa personer kan uppleva som stötande eller störande - Ny Funktion - För att aktivera denna funktion kräver det att Amethyst skickar ett NIP-24 meddelande (GiftWrapped, Förseglade Direkta och Gruppmeddelanden). NIP-24 är nytt och de flesta klienter har ännu inte implementerat det. Se till att mottagaren använder en kompatibel klient. - Aktivera + Ny Funktion + För att aktivera denna funktion kräver det att Amethyst skickar ett NIP-17 meddelande (GiftWrapped, Förseglade Direkta och Gruppmeddelanden). NIP-17 är nytt och de flesta klienter har ännu inte implementerat det. Se till att mottagaren använder en kompatibel klient. + Aktivera Publik Ny offentlig eller privat grupp Privat diff --git a/app/src/main/res/values-sw-rKE/strings.xml b/app/src/main/res/values-sw-rKE/strings.xml index 728922268..3a5f1af7c 100644 --- a/app/src/main/res/values-sw-rKE/strings.xml +++ b/app/src/main/res/values-sw-rKE/strings.xml @@ -418,9 +418,9 @@ Tumia Mahali kama Inaongeza Geohash ya eneo lako kwenye chapisho. Umma utajua kuwa uko ndani ya kilometa 5 (maili 3) ya eneo la sasa Inaongeza onyo la yaliyomo nyeti kabla ya kuonyesha yaliyomo yako. Hii ni nzuri kwa yaliyomo yoyote ya NSFW au yaliyomo ambayo baadhi ya watu wanaweza kuona kama ya kuchukiza au kusumbua - Kipengee Kipya - Kuwezesha hali hii kunahitaji Amethyst kutuma ujumbe wa NIP-24 (Ufungaji wa Zawadi, Ujumbe wa Moja kwa Moja Uliosajiliwa, na Ujumbe wa Kikundi). NIP-24 ni mpya na wateja wengi bado hawajaijumuisha. Hakikisha mpokeaji anatumia mteja unaokubaliana. - Tumia + Kipengee Kipya + Kuwezesha hali hii kunahitaji Amethyst kutuma ujumbe wa NIP-17 (Ufungaji wa Zawadi, Ujumbe wa Moja kwa Moja Uliosajiliwa, na Ujumbe wa Kikundi). NIP-17 ni mpya na wateja wengi bado hawajaijumuisha. Hakikisha mpokeaji anatumia mteja unaokubaliana. + Tumia Umma Binafsi Kwa diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 3911d1d8b..be0736327 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -472,9 +472,9 @@ เปิดเผยตําแหน่งที่ตั้ง เพิ่ม Geohash ของตําแหน่งของคุณลงในโพสต์ สาธารณชนจะรู้ว่าคุณอยู่ภายใน 5 กม. (3 ไมล์) จากตําแหน่งปัจจุบัน เพิ่มคําเตือนเนื้อหาที่ละเอียดอ่อนก่อนแสดงเนื้อหาของคุณ สิ่งนี้เหมาะสําหรับเนื้อหา NSFW หรือเนื้อหาใด ๆ ที่บางคนอาจพบว่าไม่เหมาะสมหรือรบกวน - ฟีเจอร์ใหม่ - การเปิดใช้งานโหมดนี้ต้องใช้ Amethyst เพื่อส่งข้อความ NIP-24 (GiftWrapped, Sealed Direct และ Group Messages) NIP-24 เป็นของใหม่และไคลเอ็นต์ส่วนใหญ่ยังไม่ได้รองรับ ตรวจสอบให้แน่ใจว่าเครื่องรับใช้ไคลเอ็นต์ที่รองรับ - เปิดใช้งาน + ฟีเจอร์ใหม่ + การเปิดใช้งานโหมดนี้ต้องใช้ Amethyst เพื่อส่งข้อความ NIP-17 (GiftWrapped, Sealed Direct และ Group Messages) NIP-17 เป็นของใหม่และไคลเอ็นต์ส่วนใหญ่ยังไม่ได้รองรับ ตรวจสอบให้แน่ใจว่าเครื่องรับใช้ไคลเอ็นต์ที่รองรับ + เปิดใช้งาน สาธรณะ สร้างกลุ่มสาธารณะ/ส่วนตัว ส่วนตัว diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index c966009bc..57b4e2f4b 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -418,8 +418,8 @@ Переслати Zaps до: Підтримання клієнтів переведе його на LNAddress або профіль користувача нижче замість ваших Надати місцеперебування як - Нова функція - Активувати + Нова функція + Активувати Тема бесіди "\@User1, @User2, @User3" Учасники цієї групи diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 89fc929b0..67306c7cb 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -472,9 +472,9 @@ 将位置显示为 将你所在位置的地理位置添加到帖子。公众会知道你在当前位置的5公里之内(3英里) 在显示你的内容之前添加敏感的内容警告。针对任何 NSFW 内容或一些人可能觉得有冒犯性或令人不安的内容。 - 新功能 - 启用此模式需要 Amethyst 发送一条 NIP-24 消息(包装的、密封的私信和群聊消息)。因为 NIP-24 是新的,大多数客户端尚未执行。请确保接收方正在使用兼容的客户端。 - 启用 + 新功能 + 启用此模式需要 Amethyst 发送一条 NIP-17 消息(包装的、密封的私信和群聊消息)。因为 NIP-17 是新的,大多数客户端尚未执行。请确保接收方正在使用兼容的客户端。 + 启用 公开 新建公开或私人群组 私人 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f18afff0b..eb4aa8043 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -472,9 +472,9 @@ 將位置顯示為 將你所在位置的地理位置添加到帖子。公眾會知道你在當前位置的5公里之內(3英里) 在顯示你的內容之前添加敏感內容警告。針對任何 NSFW 內容或一些人可能覺得有冒犯性或令人不安的內容。 - 新功能 - 啟用此模式需要 Amethyst 發送一條 NIP-24 消息(包裝的、密封的私信和群聊消息)。因為 NIP-24 是新的,大多數客戶端尚未執行。請確保接收方正在使用兼容的客戶端。 - 啟用 + 新功能 + 啟用此模式需要 Amethyst 發送一條 NIP-17 消息(包裝的、密封的私信和群聊消息)。因為 NIP-17 是新的,大多數客戶端尚未執行。請確保接收方正在使用兼容的客戶端。 + 啟用 公開 新建公開或私人群組 私人 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 82fb9fb56..a23c028b9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -547,9 +547,9 @@ Adds sensitive content warning before showing your content. This is ideal for any NSFW content or content some people may find offensive or disturbing - New Feature - Activating this mode requires Amethyst to send a NIP-24 message (GiftWrapped, Sealed Direct and Group Messages). NIP-24 is new and most clients have not implemented it yet. Make sure the receiver is using a compatible client. - Activate + New Feature + Activating this mode requires Amethyst to send a NIP-17 message (GiftWrapped, Sealed Direct and Group Messages). NIP-17 is new and most clients have not implemented it yet. Make sure the receiver is using a compatible client. + Activate Public New Public or Private Group diff --git a/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/GiftWrapBenchmark.kt b/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/GiftWrapBenchmark.kt index 9bab1384e..3f3ae0aaf 100644 --- a/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/GiftWrapBenchmark.kt +++ b/benchmark/src/androidTest/java/com/vitorpamplona/quartz/benchmark/GiftWrapBenchmark.kt @@ -27,7 +27,7 @@ import com.vitorpamplona.quartz.crypto.CryptoUtils import com.vitorpamplona.quartz.crypto.KeyPair import com.vitorpamplona.quartz.events.Event import com.vitorpamplona.quartz.events.GiftWrapEvent -import com.vitorpamplona.quartz.events.NIP24Factory +import com.vitorpamplona.quartz.events.NIP17Factory import com.vitorpamplona.quartz.events.SealedGossipEvent import com.vitorpamplona.quartz.signers.NostrSignerInternal import junit.framework.TestCase @@ -56,10 +56,10 @@ class GiftWrapBenchmark { val sender = NostrSignerInternal(KeyPair()) val receiver = NostrSignerInternal(KeyPair()) - var events: NIP24Factory.Result? = null + var events: NIP17Factory.Result? = null val countDownLatch = CountDownLatch(1) - NIP24Factory().createMsgNIP24( + NIP17Factory().createMsgNIP17( message, listOf(receiver.pubKey), sender, @@ -109,7 +109,7 @@ class GiftWrapBenchmark { var giftWrap: GiftWrapEvent? = null val countDownLatch = CountDownLatch(1) - NIP24Factory().createMsgNIP24( + NIP17Factory().createMsgNIP17( message, listOf(receiver.pubKey), sender, diff --git a/quartz/src/androidTest/assets/github_amethyst.html b/quartz/src/androidTest/assets/github_amethyst.html index 0b65f48f5..b57d66d03 100644 --- a/quartz/src/androidTest/assets/github_amethyst.html +++ b/quartz/src/androidTest/assets/github_amethyst.html @@ -2999,7 +2999,7 @@ "path": "README.md", "preferredFileType": "readme", "tabName": "README", - "richText": "\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv align=\"center\" dir=\"auto\"\u003e\n\u003ca href=\"https://amethyst.social\" rel=\"nofollow\"\u003e\n \u003cimg src=\"/vitorpamplona/amethyst/raw/main/docs/design/3rd%20Logo%20-%20Zitron/amethyst.svg\" alt=\"Amethyst Logo\" title=\"Amethyst logo\" width=\"80\" style=\"max-width: 100%;\"\u003e\n\u003c/a\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAmethyst\u003c/h1\u003e\u003ca id=\"user-content-amethyst\" class=\"anchor\" aria-label=\"Permalink: Amethyst\" href=\"#amethyst\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNostr Client for Android\u003c/h2\u003e\u003ca id=\"user-content-nostr-client-for-android\" class=\"anchor\" aria-label=\"Permalink: Nostr Client for Android\" href=\"#nostr-client-for-android\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eJoin the social network you control.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/vitorpamplona/amethyst/releases\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/0878846aa75325e8a839fb253814ced071155690dbcd353231e434ab626331f9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f7669746f7270616d706c6f6e612f616d6574687973742f746f74616c3f6c6162656c3d446f776e6c6f616473266c6162656c436f6c6f723d32373330334426636f6c6f723d304431313137266c6f676f3d676974687562266c6f676f436f6c6f723d464646464646267374796c653d666c6174\" alt=\"GitHub downloads\" data-canonical-src=\"https://img.shields.io/github/downloads/vitorpamplona/amethyst/total?label=Downloads\u0026amp;labelColor=27303D\u0026amp;color=0D1117\u0026amp;logo=github\u0026amp;logoColor=FFFFFF\u0026amp;style=flat\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://play.google.com/store/apps/details?id=com.vitorpamplona.amethyst\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/c7b313d9ead9e2b8e552ee508fc61bcf581966b01ecae331bc9b24bff4fb95a2/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f636f6c6f723d677265656e266c6f676f3d676f6f676c652d706c6179266c6f676f436f6c6f723d677265656e2675726c3d6874747073253341253246253246706c61792e63757a692e776f726b6572732e646576253246706c617925334669253344636f6d2e7669746f7270616d706c6f6e612e616d657468797374253236676c2533445553253236686c253344656e2532366c253344506c617953746f72652532366d25334425323473686f7274696e7374616c6c73\" alt=\"PlayStore downloads\" data-canonical-src=\"https://img.shields.io/endpoint?color=green\u0026amp;logo=google-play\u0026amp;logoColor=green\u0026amp;url=https%3A%2F%2Fplay.cuzi.workers.dev%2Fplay%3Fi%3Dcom.vitorpamplona.amethyst%26gl%3DUS%26hl%3Den%26l%3DPlayStore%26m%3D%24shortinstalls\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/vitorpamplona/amethyst\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/f5ebc205593bb022af50827339b9cf53f618317cd9fcd6997729c802a69184d3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f7669746f7270616d706c6f6e612f616d6574687973742e7376673f6d61784167653d33363030266c6162656c3d537461626c65266c6162656c436f6c6f723d30363539396426636f6c6f723d303433623639\" alt=\"Last Version\" data-canonical-src=\"https://img.shields.io/github/release/vitorpamplona/amethyst.svg?maxAge=3600\u0026amp;label=Stable\u0026amp;labelColor=06599d\u0026amp;color=043b69\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://jitpack.io/#vitorpamplona/amethyst\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/e5c584a6248e6ff915155a6464b7713018b4638811cc5feeda339e51eb071638/68747470733a2f2f6a69747061636b2e696f2f762f7669746f7270616d706c6f6e612f616d6574687973742e737667\" alt=\"JitPack version\" data-canonical-src=\"https://jitpack.io/v/vitorpamplona/amethyst.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/vitorpamplona/amethyst/actions/workflows/build.yml\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/01a016b85097d9a4b07bc3edabb001382c28a4d89d500854747d40dae989a65c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f7669746f7270616d706c6f6e612f616d6574687973742f6275696c642e796d6c3f6c6162656c436f6c6f723d323733303344\" alt=\"CI\" data-canonical-src=\"https://img.shields.io/github/actions/workflow/status/vitorpamplona/amethyst/build.yml?labelColor=27303D\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"/vitorpamplona/amethyst/blob/main/LICENSE\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/93a7675b56c8df43c2eae4bf0e029f7c879970de6631f992687f4e4c9d47c89d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f7669746f7270616d706c6f6e612f616d6574687973743f6c6162656c436f6c6f723d32373330334426636f6c6f723d303837376432\" alt=\"License: Apache-2.0\" data-canonical-src=\"https://img.shields.io/github/license/vitorpamplona/amethyst?labelColor=27303D\u0026amp;color=0877d2\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDownload and Install\u003c/h2\u003e\u003ca id=\"user-content-download-and-install\" class=\"anchor\" aria-label=\"Permalink: Download and Install\" href=\"#download-and-install\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/ImranR98/Obtainium\"\u003e\u003cimg src=\"/vitorpamplona/amethyst/raw/main/docs/design/obtainium.png\" alt=\"Get it on Obtaininum\" height=\"70\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/vitorpamplona/amethyst/releases\"\u003e\u003cimg src=\"https://github.com/machiav3lli/oandbackupx/raw/034b226cea5c1b30eb4f6a6f313e4dadcbb0ece4/badge_github.png\" alt=\"Get it on GitHub\" height=\"70\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://f-droid.org/packages/com.vitorpamplona.amethyst/\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/f422f6f830e814ec7e766de8fef4db949c6add75a9d58548ab2f5d29855c0616/68747470733a2f2f6664726f69642e6769746c61622e696f2f617274776f726b2f62616467652f6765742d69742d6f6e2e706e67\" alt=\"Get it on F-Droid\" height=\"70\" data-canonical-src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://play.google.com/store/apps/details?id=com.vitorpamplona.amethyst\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/b7c355557ebfc69c16957749e0e505786b6961aca66ec502c2766712c8c3951f/68747470733a2f2f706c61792e676f6f676c652e636f6d2f696e746c2f656e5f75732f6261646765732f696d616765732f67656e657269632f656e2d706c61792d62616467652e706e67\" alt=\"Get it on Google Play\" height=\"70\" data-canonical-src=\"https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSupported Features\u003c/h2\u003e\u003ca id=\"user-content-supported-features\" class=\"anchor\" aria-label=\"Permalink: Supported Features\" href=\"#supported-features\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/vitorpamplona/amethyst/blob/main/docs/screenshots/home.png\"\u003e\u003cimg align=\"right\" src=\"/vitorpamplona/amethyst/raw/main/docs/screenshots/home.png\" width=\"350px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Events / Relay Subscriptions (NIP-01)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Follow List (NIP-02)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e OpenTimestamps Attestations (NIP-03)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Private Messages (NIP-04)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e DNS Address (NIP-05)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Mnemonic seed phrase (NIP-06)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e WebBrowser Signer (NIP-07, Not applicable)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Old-style mentions (NIP-08)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Event Deletion (NIP-09)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Replies, mentions, Threads, and Notifications (NIP-10)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Relay Information Document (NIP-11)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Generic Tag Queries (NIP-12)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Proof of Work Display (NIP-13)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Proof of Work Calculations (NIP-13)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Events with a Subject (NIP-14)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Marketplace (NIP-15)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Event Treatment (NIP-16)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Image/Video/Url/LnInvoice Previews\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Reposts, Quotes, Generic Reposts (NIP-18)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Bech Encoding support (NIP-19)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Command Results (NIP-20)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e URI Support (NIP-21)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Long-form Content (NIP-23)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e User Profile Fields / Relay list (NIP-24)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Reactions (NIP-25)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Delegated Event Signing (NIP-26, Will not implement)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Text Note References (NIP-27)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Public Chats (NIP-28)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Custom Emoji (NIP-30)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Event kind summaries (NIP-31)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Labeling (NIP-32)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Parameterized Replaceable Events (NIP-33)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Git Stuff (NIP-34/Draft)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Sensitive Content (NIP-36)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Note Edits (NIP-37/Draft)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e User Status Event (NIP-38)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e External Identities (NIP-39)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Expiration Support (NIP-40)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Relay Authentication (NIP-42)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Event Counts (NIP-45, Will not implement)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Nostr Connect (NIP-46)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Wallet Connect API (NIP-47)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Proxy Tags (NIP-48, Not applicable)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Private key encryption for import/export (NIP-49)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Online Relay Search (NIP-50)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Lists (NIP-51)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Calendar Events (NIP-52)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Live Activities \u0026amp; Live Chats (NIP-53)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Inline Metadata (NIP-55 - Draft)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Reporting (NIP-56)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Lightning Tips\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Zaps (NIP-57)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Private Zaps\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Zap Splits (NIP-57)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Gift Wraps \u0026amp; Seals (NIP-59)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Zapraiser (NIP-TBD)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Badges (NIP-58)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Relay List Metadata (NIP-65)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Polls (NIP-69)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Moderated Communities (NIP-72)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Zap Goals (NIP-75)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Arbitrary Custom App Data (NIP-78)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Highlights (NIP-84)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Recommended Application Handlers (NIP-89)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Data Vending Machine (NIP-90)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Inline Metadata (NIP-92)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Verifiable file URLs (NIP-94)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Binary Blobs (NIP-95)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e HTTP File Storage Integration (NIP-96 Draft)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e HTTP Auth (NIP-98)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Classifieds (NIP-99)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Private Messages and Small Groups (NIP-24/Draft)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Versioned Encrypted Payloads (NIP-44/Draft)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Audio Tracks (zapstr.live) (kind:31337)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Push Notifications (Google and Unified Push)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e In-Device Automatic Translations\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Hashtag Following and Custom Hashtags\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Login with QR\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Bounty support (nostrbounties.com)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e De-googled F-Droid flavor\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Multiple Accounts\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Markdown Support\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e FHIR Payloads (kind:82)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Decentralized Wiki (kind:30818)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Embed events\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Image/Video Capture in the app\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Local Database\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Workspaces\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Infinity Scroll\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePrivacy and Information Permanence\u003c/h2\u003e\u003ca id=\"user-content-privacy-and-information-permanence\" class=\"anchor\" aria-label=\"Permalink: Privacy and Information Permanence\" href=\"#privacy-and-information-permanence\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRelays know your IP address, your name, your location (guessed from IP), your pub key, all your contacts, and other relays, and can read every action you do (post, like, boost, quote, report, etc) except for Private Zaps and Private DMs. While the content of direct messages (DMs) is only visible to you and your DM counterparty, everyone can see when you and your counterparty DM each other.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf you want to improve your privacy, consider utilizing a service that masks your IP address (e.g. a VPN or Tor) from trackers online.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe relay also learns which public keys you are requesting, meaning your public key will be tied to your IP address.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eInformation shared on Nostr can be re-broadcasted to other servers and should be assumed permanent for privacy purposes. There is no way to guarantee the deletion of any content once posted.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDevelopment Overview\u003c/h1\u003e\u003ca id=\"user-content-development-overview\" class=\"anchor\" aria-label=\"Permalink: Development Overview\" href=\"#development-overview\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis repository is split between Amethyst and Quartz:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eAmethyst is a native Android app made with Kotlin and Jetpack Compose.\u003c/li\u003e\n\u003cli\u003eQuartz is our own Nostr-commons library to host classes that are of interest to other Nostr Clients.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe app architecture consists of the UI, which uses the usual State/ViewModel/Composition, the service layer that connects with Nostr relays,\nand the model/repository layer, which keeps all Nostr objects in memory, in a full OO graph.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe repository layer stores Nostr Events as Notes and Users separately. Those classes use LiveData and Flow objects to\nallow the UI and other parts of the app to subscribe to each Note/User and receive updates when they happen.\nThey are also responsible for updating viewModels when needed. As the user scrolls through Events, the Datasource classes\nare updated to receive more information about those particular Events.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMost of the UI is reactive to changes in the repository classes. The service layer assembles Nostr filters for each need of the app,\nreceives the data from the Relay, and sends it to the repository. Connection with relays is never closed during the use of the app.\nThe UI receives a notification that objects have been updated. Instances of User and Notes are mutable directly.\nThere will never be two Notes with the same ID or two User instances with the same pubkey.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eLastly, the user's account information (private key/pub key) is stored in the Android KeyStore for security.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSetup\u003c/h2\u003e\u003ca id=\"user-content-setup\" class=\"anchor\" aria-label=\"Permalink: Setup\" href=\"#setup\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMake sure to have the following pre-requisites installed:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eJava 17+\u003c/li\u003e\n\u003cli\u003eAndroid Studio\u003c/li\u003e\n\u003cli\u003eAndroid 8.0+ Phone or Emulation setup\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eFork and clone this repository and import it into Android Studio\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https://github.com/vitorpamplona/amethyst.git\"\u003e\u003cpre\u003egit clone https://github.com/vitorpamplona/amethyst.git\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse an Android Studio build action to install and run the app on your device or a simulator.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBuilding\u003c/h2\u003e\u003ca id=\"user-content-building\" class=\"anchor\" aria-label=\"Permalink: Building\" href=\"#building\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuild the app:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./gradlew assembleDebug\"\u003e\u003cpre\u003e./gradlew assembleDebug\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTesting\u003c/h2\u003e\u003ca id=\"user-content-testing\" class=\"anchor\" aria-label=\"Permalink: Testing\" href=\"#testing\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./gradlew test\n./gradlew connectedAndroidTest\"\u003e\u003cpre\u003e./gradlew \u003cspan class=\"pl-c1\"\u003etest\u003c/span\u003e\n./gradlew connectedAndroidTest\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLinting\u003c/h2\u003e\u003ca id=\"user-content-linting\" class=\"anchor\" aria-label=\"Permalink: Linting\" href=\"#linting\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./gradlew spotlessCheck\n./gradlew spotlessApply\"\u003e\u003cpre\u003e./gradlew spotlessCheck\n./gradlew spotlessApply\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInstalling on device\u003c/h2\u003e\u003ca id=\"user-content-installing-on-device\" class=\"anchor\" aria-label=\"Permalink: Installing on device\" href=\"#installing-on-device\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor the F-Droid build:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./gradlew installFdroidDebug\"\u003e\u003cpre\u003e./gradlew installFdroidDebug\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor the Play build:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./gradlew installPlayDebug\"\u003e\u003cpre\u003e./gradlew installPlayDebug\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDeploying\u003c/h2\u003e\u003ca id=\"user-content-deploying\" class=\"anchor\" aria-label=\"Permalink: Deploying\" href=\"#deploying\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eGenerate a new signing key\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"keytool -genkey -v -keystore \u0026lt;my-release-key.keystore\u0026gt; -alias \u0026lt;alias_name\u0026gt; -keyalg RSA -keysize 2048 -validity 10000\nopenssl base64 \u0026lt; \u0026lt;my-release-key.keystore\u0026gt; | tr -d '\\n' | tee some_signing_key.jks.base64.txt\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003ekeytool -genkey -v -keystore \u0026lt;my-release-key.keystore\u0026gt; -alias \u0026lt;alias_name\u0026gt; -keyalg RSA -keysize 2048 -validity 10000\nopenssl base64 \u0026lt; \u0026lt;my-release-key.keystore\u0026gt; | tr -d '\\n' | tee some_signing_key.jks.base64.txt\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003col start=\"2\" dir=\"auto\"\u003e\n\u003cli\u003eCreate four Secret Key variables on your GitHub repository and fill in the signing key information\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eKEY_ALIAS\u003c/code\u003e \u0026lt;- \u003ccode\u003e\u0026lt;alias_name\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eKEY_PASSWORD\u003c/code\u003e \u0026lt;- \u003ccode\u003e\u0026lt;your password\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eKEY_STORE_PASSWORD\u003c/code\u003e \u0026lt;- \u003ccode\u003e\u0026lt;your key store password\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSIGNING_KEY\u003c/code\u003e \u0026lt;- the data from \u003ccode\u003e\u0026lt;my-release-key.keystore\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eChange the \u003ccode\u003eversionCode\u003c/code\u003e and \u003ccode\u003eversionName\u003c/code\u003e on \u003ccode\u003eapp/build.gradle\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCommit and push.\u003c/li\u003e\n\u003cli\u003eTag the commit with \u003ccode\u003ev{x.x.x}\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLet the \u003ca href=\"https://github.com/vitorpamplona/amethyst/actions/workflows/create-release.yml\"\u003eCreate Release GitHub Action\u003c/a\u003e build a new \u003ccode\u003eaab\u003c/code\u003e file.\u003c/li\u003e\n\u003cli\u003eAdd your CHANGE LOG to the description of the new release\u003c/li\u003e\n\u003cli\u003eDownload the \u003ccode\u003eaab\u003c/code\u003e file and upload it to the PlayStore.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUsing the Quartz library\u003c/h2\u003e\u003ca id=\"user-content-using-the-quartz-library\" class=\"anchor\" aria-label=\"Permalink: Using the Quartz library\" href=\"#using-the-quartz-library\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSetup \u003ca href=\"https://jitpack.io/#vitorpamplona/amethyst/v0.84.3\" rel=\"nofollow\"\u003eJitPack.io\u003c/a\u003e to your build file\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAdd \u003ccode\u003emaven { url 'https://jitpack.io' }\u003c/code\u003e to settings.gradle at the end of repositories:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-groovy-gradle notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"dependencyResolutionManagement {\n repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n repositories {\n mavenCentral()\n maven { url 'https://jitpack.io' }\n }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003edependencyResolutionManagement\u003c/span\u003e {\n repositoriesMode\u003cspan class=\"pl-k\"\u003e.\u003c/span\u003eset(\u003cspan class=\"pl-k\"\u003eRepositoriesMode\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eFAIL_ON_PROJECT_REPOS\u003c/span\u003e)\n repositories {\n mavenCentral()\n maven { url \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ehttps://jitpack.io\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e }\n }\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAdd the dependency\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-groovy-gradle notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"implementation('com.github.vitorpamplona.amethyst:quartz:v0.85.1')\"\u003e\u003cpre\u003eimplementation(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ecom.github.vitorpamplona.amethyst:quartz:v0.85.1\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContributing\u003c/h2\u003e\u003ca id=\"user-content-contributing\" class=\"anchor\" aria-label=\"Permalink: Contributing\" href=\"#contributing\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIssues can be logged on: \u003ca href=\"https://gitworkshop.dev/repo/amethyst\" rel=\"nofollow\"\u003ehttps://gitworkshop.dev/repo/amethyst\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/vitorpamplona/amethyst/issues\"\u003eGitHub issues\u003c/a\u003e and \u003ca href=\"https://github.com/vitorpamplona/amethyst/pulls\"\u003epull requests\u003c/a\u003e here are also welcome. Translations can be provided via \u003ca href=\"https://crowdin.com/project/amethyst-social\" rel=\"nofollow\"\u003eCrowdin\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou can also send patches through Nostr using \u003ca href=\"https://github.com/fiatjaf/gitstr\"\u003eGitStr\u003c/a\u003e to \u003ca href=\"https://patch34.pages.dev/naddr1qqyxzmt9w358jum5qyg8v6t5daezumn0wd68yvfwvdhk6qg7waehxw309ahx7um5wgkhqatz9emk2mrvdaexgetj9ehx2ap0qy2hwumn8ghj7un9d3shjtnwdaehgu3wvfnj7q3qgcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqxpqqqpmej720gac\" rel=\"nofollow\"\u003ethis nostr address\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBy contributing to this repository, you agree to license your work under the MIT license. Any work contributed where you are not the original author must contain its license header with the original author(s) and source.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eScreenshots\u003c/h1\u003e\u003ca id=\"user-content-screenshots\" class=\"anchor\" aria-label=\"Permalink: Screenshots\" href=\"#screenshots\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFollowFeeds\u003c/th\u003e\n\u003cth\u003eChatsGroup\u003c/th\u003e\n\u003cth\u003eLiveStreams\u003c/th\u003e\n\u003cth\u003eNotifications\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/vitorpamplona/amethyst/blob/main/docs/screenshots/home.png\"\u003e\u003cimg src=\"/vitorpamplona/amethyst/raw/main/docs/screenshots/home.png\" alt=\"Home Feed\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/vitorpamplona/amethyst/blob/main/docs/screenshots/messages.png\"\u003e\u003cimg src=\"/vitorpamplona/amethyst/raw/main/docs/screenshots/messages.png\" alt=\"Messages\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/vitorpamplona/amethyst/blob/main/docs/screenshots/replies.png\"\u003e\u003cimg src=\"/vitorpamplona/amethyst/raw/main/docs/screenshots/replies.png\" alt=\"Live Streams\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/vitorpamplona/amethyst/blob/main/docs/screenshots/notifications.png\"\u003e\u003cimg src=\"/vitorpamplona/amethyst/raw/main/docs/screenshots/notifications.png\" alt=\"Notifications\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContributors\u003c/h1\u003e\u003ca id=\"user-content-contributors\" class=\"anchor\" aria-label=\"Permalink: Contributors\" href=\"#contributors\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003ca align=\"center\" href=\"https://github.com/vitorpamplona/amethyst/graphs/contributors\"\u003e\n \u003cimg src=\"https://camo.githubusercontent.com/49db37c2d4e5559fd7833fa337a80bc3cb3a11fcbe4c228e50c624856eef7d6d/68747470733a2f2f636f6e747269622e726f636b732f696d6167653f7265706f3d7669746f7270616d706c6f6e612f616d657468797374\" data-canonical-src=\"https://contrib.rocks/image?repo=vitorpamplona/amethyst\" style=\"max-width: 100%;\"\u003e\n\u003c/a\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMIT License\u003c/h1\u003e\u003ca id=\"user-content-mit-license\" class=\"anchor\" aria-label=\"Permalink: MIT License\" href=\"#mit-license\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cpre\u003eCopyright (c) 2023 Vitor Pamplona\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\u003c/pre\u003e\n\u003c/article\u003e", + "richText": "\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv align=\"center\" dir=\"auto\"\u003e\n\u003ca href=\"https://amethyst.social\" rel=\"nofollow\"\u003e\n \u003cimg src=\"/vitorpamplona/amethyst/raw/main/docs/design/3rd%20Logo%20-%20Zitron/amethyst.svg\" alt=\"Amethyst Logo\" title=\"Amethyst logo\" width=\"80\" style=\"max-width: 100%;\"\u003e\n\u003c/a\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAmethyst\u003c/h1\u003e\u003ca id=\"user-content-amethyst\" class=\"anchor\" aria-label=\"Permalink: Amethyst\" href=\"#amethyst\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNostr Client for Android\u003c/h2\u003e\u003ca id=\"user-content-nostr-client-for-android\" class=\"anchor\" aria-label=\"Permalink: Nostr Client for Android\" href=\"#nostr-client-for-android\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eJoin the social network you control.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/vitorpamplona/amethyst/releases\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/0878846aa75325e8a839fb253814ced071155690dbcd353231e434ab626331f9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f7669746f7270616d706c6f6e612f616d6574687973742f746f74616c3f6c6162656c3d446f776e6c6f616473266c6162656c436f6c6f723d32373330334426636f6c6f723d304431313137266c6f676f3d676974687562266c6f676f436f6c6f723d464646464646267374796c653d666c6174\" alt=\"GitHub downloads\" data-canonical-src=\"https://img.shields.io/github/downloads/vitorpamplona/amethyst/total?label=Downloads\u0026amp;labelColor=27303D\u0026amp;color=0D1117\u0026amp;logo=github\u0026amp;logoColor=FFFFFF\u0026amp;style=flat\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://play.google.com/store/apps/details?id=com.vitorpamplona.amethyst\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/c7b313d9ead9e2b8e552ee508fc61bcf581966b01ecae331bc9b24bff4fb95a2/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f636f6c6f723d677265656e266c6f676f3d676f6f676c652d706c6179266c6f676f436f6c6f723d677265656e2675726c3d6874747073253341253246253246706c61792e63757a692e776f726b6572732e646576253246706c617925334669253344636f6d2e7669746f7270616d706c6f6e612e616d657468797374253236676c2533445553253236686c253344656e2532366c253344506c617953746f72652532366d25334425323473686f7274696e7374616c6c73\" alt=\"PlayStore downloads\" data-canonical-src=\"https://img.shields.io/endpoint?color=green\u0026amp;logo=google-play\u0026amp;logoColor=green\u0026amp;url=https%3A%2F%2Fplay.cuzi.workers.dev%2Fplay%3Fi%3Dcom.vitorpamplona.amethyst%26gl%3DUS%26hl%3Den%26l%3DPlayStore%26m%3D%24shortinstalls\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/vitorpamplona/amethyst\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/f5ebc205593bb022af50827339b9cf53f618317cd9fcd6997729c802a69184d3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f7669746f7270616d706c6f6e612f616d6574687973742e7376673f6d61784167653d33363030266c6162656c3d537461626c65266c6162656c436f6c6f723d30363539396426636f6c6f723d303433623639\" alt=\"Last Version\" data-canonical-src=\"https://img.shields.io/github/release/vitorpamplona/amethyst.svg?maxAge=3600\u0026amp;label=Stable\u0026amp;labelColor=06599d\u0026amp;color=043b69\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://jitpack.io/#vitorpamplona/amethyst\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/e5c584a6248e6ff915155a6464b7713018b4638811cc5feeda339e51eb071638/68747470733a2f2f6a69747061636b2e696f2f762f7669746f7270616d706c6f6e612f616d6574687973742e737667\" alt=\"JitPack version\" data-canonical-src=\"https://jitpack.io/v/vitorpamplona/amethyst.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/vitorpamplona/amethyst/actions/workflows/build.yml\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/01a016b85097d9a4b07bc3edabb001382c28a4d89d500854747d40dae989a65c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f7669746f7270616d706c6f6e612f616d6574687973742f6275696c642e796d6c3f6c6162656c436f6c6f723d323733303344\" alt=\"CI\" data-canonical-src=\"https://img.shields.io/github/actions/workflow/status/vitorpamplona/amethyst/build.yml?labelColor=27303D\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"/vitorpamplona/amethyst/blob/main/LICENSE\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/93a7675b56c8df43c2eae4bf0e029f7c879970de6631f992687f4e4c9d47c89d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f7669746f7270616d706c6f6e612f616d6574687973743f6c6162656c436f6c6f723d32373330334426636f6c6f723d303837376432\" alt=\"License: Apache-2.0\" data-canonical-src=\"https://img.shields.io/github/license/vitorpamplona/amethyst?labelColor=27303D\u0026amp;color=0877d2\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDownload and Install\u003c/h2\u003e\u003ca id=\"user-content-download-and-install\" class=\"anchor\" aria-label=\"Permalink: Download and Install\" href=\"#download-and-install\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/ImranR98/Obtainium\"\u003e\u003cimg src=\"/vitorpamplona/amethyst/raw/main/docs/design/obtainium.png\" alt=\"Get it on Obtaininum\" height=\"70\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/vitorpamplona/amethyst/releases\"\u003e\u003cimg src=\"https://github.com/machiav3lli/oandbackupx/raw/034b226cea5c1b30eb4f6a6f313e4dadcbb0ece4/badge_github.png\" alt=\"Get it on GitHub\" height=\"70\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://f-droid.org/packages/com.vitorpamplona.amethyst/\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/f422f6f830e814ec7e766de8fef4db949c6add75a9d58548ab2f5d29855c0616/68747470733a2f2f6664726f69642e6769746c61622e696f2f617274776f726b2f62616467652f6765742d69742d6f6e2e706e67\" alt=\"Get it on F-Droid\" height=\"70\" data-canonical-src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://play.google.com/store/apps/details?id=com.vitorpamplona.amethyst\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/b7c355557ebfc69c16957749e0e505786b6961aca66ec502c2766712c8c3951f/68747470733a2f2f706c61792e676f6f676c652e636f6d2f696e746c2f656e5f75732f6261646765732f696d616765732f67656e657269632f656e2d706c61792d62616467652e706e67\" alt=\"Get it on Google Play\" height=\"70\" data-canonical-src=\"https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSupported Features\u003c/h2\u003e\u003ca id=\"user-content-supported-features\" class=\"anchor\" aria-label=\"Permalink: Supported Features\" href=\"#supported-features\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/vitorpamplona/amethyst/blob/main/docs/screenshots/home.png\"\u003e\u003cimg align=\"right\" src=\"/vitorpamplona/amethyst/raw/main/docs/screenshots/home.png\" width=\"350px\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Events / Relay Subscriptions (NIP-01)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Follow List (NIP-02)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e OpenTimestamps Attestations (NIP-03)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Private Messages (NIP-04)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e DNS Address (NIP-05)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Mnemonic seed phrase (NIP-06)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e WebBrowser Signer (NIP-07, Not applicable)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Old-style mentions (NIP-08)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Event Deletion (NIP-09)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Replies, mentions, Threads, and Notifications (NIP-10)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Relay Information Document (NIP-11)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Generic Tag Queries (NIP-12)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Proof of Work Display (NIP-13)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Proof of Work Calculations (NIP-13)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Events with a Subject (NIP-14)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Marketplace (NIP-15)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Event Treatment (NIP-16)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Image/Video/Url/LnInvoice Previews\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Reposts, Quotes, Generic Reposts (NIP-18)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Bech Encoding support (NIP-19)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Command Results (NIP-20)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e URI Support (NIP-21)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Long-form Content (NIP-23)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e User Profile Fields / Relay list (NIP-17)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Reactions (NIP-25)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Delegated Event Signing (NIP-26, Will not implement)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Text Note References (NIP-27)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Public Chats (NIP-28)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Custom Emoji (NIP-30)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Event kind summaries (NIP-31)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Labeling (NIP-32)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Parameterized Replaceable Events (NIP-33)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Git Stuff (NIP-34/Draft)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Sensitive Content (NIP-36)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Note Edits (NIP-37/Draft)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e User Status Event (NIP-38)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e External Identities (NIP-39)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Expiration Support (NIP-40)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Relay Authentication (NIP-42)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Event Counts (NIP-45, Will not implement)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Nostr Connect (NIP-46)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Wallet Connect API (NIP-47)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Proxy Tags (NIP-48, Not applicable)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Private key encryption for import/export (NIP-49)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Online Relay Search (NIP-50)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Lists (NIP-51)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Calendar Events (NIP-52)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Live Activities \u0026amp; Live Chats (NIP-53)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Inline Metadata (NIP-55 - Draft)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Reporting (NIP-56)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Lightning Tips\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Zaps (NIP-57)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Private Zaps\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Zap Splits (NIP-57)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Gift Wraps \u0026amp; Seals (NIP-59)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Zapraiser (NIP-TBD)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Badges (NIP-58)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Relay List Metadata (NIP-65)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Polls (NIP-69)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Moderated Communities (NIP-72)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Zap Goals (NIP-75)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Arbitrary Custom App Data (NIP-78)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Highlights (NIP-84)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Recommended Application Handlers (NIP-89)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Data Vending Machine (NIP-90)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Inline Metadata (NIP-92)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Verifiable file URLs (NIP-94)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Binary Blobs (NIP-95)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e HTTP File Storage Integration (NIP-96 Draft)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e HTTP Auth (NIP-98)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Classifieds (NIP-99)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Private Messages and Small Groups (NIP-17/Draft)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Versioned Encrypted Payloads (NIP-44/Draft)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Audio Tracks (zapstr.live) (kind:31337)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Push Notifications (Google and Unified Push)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e In-Device Automatic Translations\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Hashtag Following and Custom Hashtags\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Login with QR\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Bounty support (nostrbounties.com)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e De-googled F-Droid flavor\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Multiple Accounts\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e Markdown Support\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" checked=\"\"\u003e FHIR Payloads (kind:82)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Decentralized Wiki (kind:30818)\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Embed events\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Image/Video Capture in the app\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Local Database\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Workspaces\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\"\u003e Infinity Scroll\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePrivacy and Information Permanence\u003c/h2\u003e\u003ca id=\"user-content-privacy-and-information-permanence\" class=\"anchor\" aria-label=\"Permalink: Privacy and Information Permanence\" href=\"#privacy-and-information-permanence\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRelays know your IP address, your name, your location (guessed from IP), your pub key, all your contacts, and other relays, and can read every action you do (post, like, boost, quote, report, etc) except for Private Zaps and Private DMs. While the content of direct messages (DMs) is only visible to you and your DM counterparty, everyone can see when you and your counterparty DM each other.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf you want to improve your privacy, consider utilizing a service that masks your IP address (e.g. a VPN or Tor) from trackers online.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe relay also learns which public keys you are requesting, meaning your public key will be tied to your IP address.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eInformation shared on Nostr can be re-broadcasted to other servers and should be assumed permanent for privacy purposes. There is no way to guarantee the deletion of any content once posted.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDevelopment Overview\u003c/h1\u003e\u003ca id=\"user-content-development-overview\" class=\"anchor\" aria-label=\"Permalink: Development Overview\" href=\"#development-overview\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis repository is split between Amethyst and Quartz:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eAmethyst is a native Android app made with Kotlin and Jetpack Compose.\u003c/li\u003e\n\u003cli\u003eQuartz is our own Nostr-commons library to host classes that are of interest to other Nostr Clients.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe app architecture consists of the UI, which uses the usual State/ViewModel/Composition, the service layer that connects with Nostr relays,\nand the model/repository layer, which keeps all Nostr objects in memory, in a full OO graph.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe repository layer stores Nostr Events as Notes and Users separately. Those classes use LiveData and Flow objects to\nallow the UI and other parts of the app to subscribe to each Note/User and receive updates when they happen.\nThey are also responsible for updating viewModels when needed. As the user scrolls through Events, the Datasource classes\nare updated to receive more information about those particular Events.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMost of the UI is reactive to changes in the repository classes. The service layer assembles Nostr filters for each need of the app,\nreceives the data from the Relay, and sends it to the repository. Connection with relays is never closed during the use of the app.\nThe UI receives a notification that objects have been updated. Instances of User and Notes are mutable directly.\nThere will never be two Notes with the same ID or two User instances with the same pubkey.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eLastly, the user's account information (private key/pub key) is stored in the Android KeyStore for security.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSetup\u003c/h2\u003e\u003ca id=\"user-content-setup\" class=\"anchor\" aria-label=\"Permalink: Setup\" href=\"#setup\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMake sure to have the following pre-requisites installed:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eJava 17+\u003c/li\u003e\n\u003cli\u003eAndroid Studio\u003c/li\u003e\n\u003cli\u003eAndroid 8.0+ Phone or Emulation setup\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eFork and clone this repository and import it into Android Studio\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https://github.com/vitorpamplona/amethyst.git\"\u003e\u003cpre\u003egit clone https://github.com/vitorpamplona/amethyst.git\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse an Android Studio build action to install and run the app on your device or a simulator.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBuilding\u003c/h2\u003e\u003ca id=\"user-content-building\" class=\"anchor\" aria-label=\"Permalink: Building\" href=\"#building\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuild the app:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./gradlew assembleDebug\"\u003e\u003cpre\u003e./gradlew assembleDebug\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTesting\u003c/h2\u003e\u003ca id=\"user-content-testing\" class=\"anchor\" aria-label=\"Permalink: Testing\" href=\"#testing\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./gradlew test\n./gradlew connectedAndroidTest\"\u003e\u003cpre\u003e./gradlew \u003cspan class=\"pl-c1\"\u003etest\u003c/span\u003e\n./gradlew connectedAndroidTest\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLinting\u003c/h2\u003e\u003ca id=\"user-content-linting\" class=\"anchor\" aria-label=\"Permalink: Linting\" href=\"#linting\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./gradlew spotlessCheck\n./gradlew spotlessApply\"\u003e\u003cpre\u003e./gradlew spotlessCheck\n./gradlew spotlessApply\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInstalling on device\u003c/h2\u003e\u003ca id=\"user-content-installing-on-device\" class=\"anchor\" aria-label=\"Permalink: Installing on device\" href=\"#installing-on-device\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor the F-Droid build:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./gradlew installFdroidDebug\"\u003e\u003cpre\u003e./gradlew installFdroidDebug\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor the Play build:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"./gradlew installPlayDebug\"\u003e\u003cpre\u003e./gradlew installPlayDebug\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDeploying\u003c/h2\u003e\u003ca id=\"user-content-deploying\" class=\"anchor\" aria-label=\"Permalink: Deploying\" href=\"#deploying\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eGenerate a new signing key\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"keytool -genkey -v -keystore \u0026lt;my-release-key.keystore\u0026gt; -alias \u0026lt;alias_name\u0026gt; -keyalg RSA -keysize 2048 -validity 10000\nopenssl base64 \u0026lt; \u0026lt;my-release-key.keystore\u0026gt; | tr -d '\\n' | tee some_signing_key.jks.base64.txt\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003ekeytool -genkey -v -keystore \u0026lt;my-release-key.keystore\u0026gt; -alias \u0026lt;alias_name\u0026gt; -keyalg RSA -keysize 2048 -validity 10000\nopenssl base64 \u0026lt; \u0026lt;my-release-key.keystore\u0026gt; | tr -d '\\n' | tee some_signing_key.jks.base64.txt\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003col start=\"2\" dir=\"auto\"\u003e\n\u003cli\u003eCreate four Secret Key variables on your GitHub repository and fill in the signing key information\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eKEY_ALIAS\u003c/code\u003e \u0026lt;- \u003ccode\u003e\u0026lt;alias_name\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eKEY_PASSWORD\u003c/code\u003e \u0026lt;- \u003ccode\u003e\u0026lt;your password\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eKEY_STORE_PASSWORD\u003c/code\u003e \u0026lt;- \u003ccode\u003e\u0026lt;your key store password\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSIGNING_KEY\u003c/code\u003e \u0026lt;- the data from \u003ccode\u003e\u0026lt;my-release-key.keystore\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eChange the \u003ccode\u003eversionCode\u003c/code\u003e and \u003ccode\u003eversionName\u003c/code\u003e on \u003ccode\u003eapp/build.gradle\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCommit and push.\u003c/li\u003e\n\u003cli\u003eTag the commit with \u003ccode\u003ev{x.x.x}\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLet the \u003ca href=\"https://github.com/vitorpamplona/amethyst/actions/workflows/create-release.yml\"\u003eCreate Release GitHub Action\u003c/a\u003e build a new \u003ccode\u003eaab\u003c/code\u003e file.\u003c/li\u003e\n\u003cli\u003eAdd your CHANGE LOG to the description of the new release\u003c/li\u003e\n\u003cli\u003eDownload the \u003ccode\u003eaab\u003c/code\u003e file and upload it to the PlayStore.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUsing the Quartz library\u003c/h2\u003e\u003ca id=\"user-content-using-the-quartz-library\" class=\"anchor\" aria-label=\"Permalink: Using the Quartz library\" href=\"#using-the-quartz-library\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSetup \u003ca href=\"https://jitpack.io/#vitorpamplona/amethyst/v0.84.3\" rel=\"nofollow\"\u003eJitPack.io\u003c/a\u003e to your build file\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAdd \u003ccode\u003emaven { url 'https://jitpack.io' }\u003c/code\u003e to settings.gradle at the end of repositories:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-groovy-gradle notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"dependencyResolutionManagement {\n repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n repositories {\n mavenCentral()\n maven { url 'https://jitpack.io' }\n }\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003edependencyResolutionManagement\u003c/span\u003e {\n repositoriesMode\u003cspan class=\"pl-k\"\u003e.\u003c/span\u003eset(\u003cspan class=\"pl-k\"\u003eRepositoriesMode\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e.\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eFAIL_ON_PROJECT_REPOS\u003c/span\u003e)\n repositories {\n mavenCentral()\n maven { url \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ehttps://jitpack.io\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e }\n }\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAdd the dependency\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-groovy-gradle notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"implementation('com.github.vitorpamplona.amethyst:quartz:v0.85.1')\"\u003e\u003cpre\u003eimplementation(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003ecom.github.vitorpamplona.amethyst:quartz:v0.85.1\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContributing\u003c/h2\u003e\u003ca id=\"user-content-contributing\" class=\"anchor\" aria-label=\"Permalink: Contributing\" href=\"#contributing\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIssues can be logged on: \u003ca href=\"https://gitworkshop.dev/repo/amethyst\" rel=\"nofollow\"\u003ehttps://gitworkshop.dev/repo/amethyst\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/vitorpamplona/amethyst/issues\"\u003eGitHub issues\u003c/a\u003e and \u003ca href=\"https://github.com/vitorpamplona/amethyst/pulls\"\u003epull requests\u003c/a\u003e here are also welcome. Translations can be provided via \u003ca href=\"https://crowdin.com/project/amethyst-social\" rel=\"nofollow\"\u003eCrowdin\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou can also send patches through Nostr using \u003ca href=\"https://github.com/fiatjaf/gitstr\"\u003eGitStr\u003c/a\u003e to \u003ca href=\"https://patch34.pages.dev/naddr1qqyxzmt9w358jum5qyg8v6t5daezumn0wd68yvfwvdhk6qg7waehxw309ahx7um5wgkhqatz9emk2mrvdaexgetj9ehx2ap0qy2hwumn8ghj7un9d3shjtnwdaehgu3wvfnj7q3qgcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqxpqqqpmej720gac\" rel=\"nofollow\"\u003ethis nostr address\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBy contributing to this repository, you agree to license your work under the MIT license. Any work contributed where you are not the original author must contain its license header with the original author(s) and source.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eScreenshots\u003c/h1\u003e\u003ca id=\"user-content-screenshots\" class=\"anchor\" aria-label=\"Permalink: Screenshots\" href=\"#screenshots\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFollowFeeds\u003c/th\u003e\n\u003cth\u003eChatsGroup\u003c/th\u003e\n\u003cth\u003eLiveStreams\u003c/th\u003e\n\u003cth\u003eNotifications\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/vitorpamplona/amethyst/blob/main/docs/screenshots/home.png\"\u003e\u003cimg src=\"/vitorpamplona/amethyst/raw/main/docs/screenshots/home.png\" alt=\"Home Feed\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/vitorpamplona/amethyst/blob/main/docs/screenshots/messages.png\"\u003e\u003cimg src=\"/vitorpamplona/amethyst/raw/main/docs/screenshots/messages.png\" alt=\"Messages\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/vitorpamplona/amethyst/blob/main/docs/screenshots/replies.png\"\u003e\u003cimg src=\"/vitorpamplona/amethyst/raw/main/docs/screenshots/replies.png\" alt=\"Live Streams\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"/vitorpamplona/amethyst/blob/main/docs/screenshots/notifications.png\"\u003e\u003cimg src=\"/vitorpamplona/amethyst/raw/main/docs/screenshots/notifications.png\" alt=\"Notifications\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContributors\u003c/h1\u003e\u003ca id=\"user-content-contributors\" class=\"anchor\" aria-label=\"Permalink: Contributors\" href=\"#contributors\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003ca align=\"center\" href=\"https://github.com/vitorpamplona/amethyst/graphs/contributors\"\u003e\n \u003cimg src=\"https://camo.githubusercontent.com/49db37c2d4e5559fd7833fa337a80bc3cb3a11fcbe4c228e50c624856eef7d6d/68747470733a2f2f636f6e747269622e726f636b732f696d6167653f7265706f3d7669746f7270616d706c6f6e612f616d657468797374\" data-canonical-src=\"https://contrib.rocks/image?repo=vitorpamplona/amethyst\" style=\"max-width: 100%;\"\u003e\n\u003c/a\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMIT License\u003c/h1\u003e\u003ca id=\"user-content-mit-license\" class=\"anchor\" aria-label=\"Permalink: MIT License\" href=\"#mit-license\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cpre\u003eCopyright (c) 2023 Vitor Pamplona\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\u003c/pre\u003e\n\u003c/article\u003e", "loaded": true, "timedOut": false, "errorMessage": null, @@ -5828,7 +5828,7 @@ data-styled.g103[id="UnderlineNav__NavigationList-sc-1jfr31k-0"]{content:"bPgibo type="checkbox"> User Profile Fields / Relay list - (NIP-24) + (NIP-17)
  • Private Messages and Small Groups - (NIP-24/Draft) + (NIP-17/Draft)
  • ) private fun recursiveGiftWrapCreation( @@ -65,7 +65,7 @@ class NIP24Factory { recursiveGiftWrapCreation(event, to.toList(), signer, wraps, onReady) } - fun createMsgNIP24( + fun createMsgNIP17( msg: String, to: List, signer: NostrSigner,