vitorpamplona
@vitorpamplona
Public Skills
find-missing-translations
by vitorpamplona
Use when comparing Android strings.xml locale files to find untranslated string resources, missing translation keys, or preparing translation work for a specific language
find-non-lambda-logs
by vitorpamplona
Use when auditing or migrating Log calls — flags interpolated Log.d/i/w/e that should use the lambda overload (allocation hygiene), catch-block Log.w/e that interpolate ${e.message} but drop the throwable (lost stack traces), and files still importing android.util.Log (no lambda overload, bypasses Log.minLevel)
quartz-integration
by vitorpamplona
Integration guide for using the Quartz Nostr KMP library in external projects. Use when: (1) adding Quartz as a Gradle dependency, (2) setting up NostrClient with WebSocket, (3) creating/signing/sending events, (4) building relay subscriptions with Filter, (5) handling keys with KeyPair/NostrSignerInternal, (6) using Bech32 encoding/decoding (NIP-19), (7) platform-specific setup (Android vs JVM/Desktop), (8) NIP-57 zaps, NIP-17 DMs, NIP-44 encryption in external projects, (9) running a relay on Quartz and serving/building its NIP-11 relay information document (application/nostr+json).
relay-client
by vitorpamplona
Subscription and filter-assembly patterns for the Amethyst relay client layer in commons/.../relayClient/. Use when working with compose-scoped subscriptions (ComposeSubscriptionManager, Subscribable), filter assemblers (MetadataFilterAssembler, ReactionsFilterAssembler, FeedMetadataCoordinator), preloaders (MetadataPreloader, MetadataRateLimiter), EOSE managers, or any feature that needs to talk to relays lifecycle-aware from a composable. Complements nostr-expert (protocol filter syntax) and kotlin-coroutines (callbackFlow patterns).
nip85-trusted-assertions
by vitorpamplona
The NIP-85 trusted-assertions model in Quartz (nip85TrustedAssertions/) — kind 10040 trust-provider lists, kind 30382 contact cards / user assertions, 30383 event assertions, 30384 addressable assertions, 30385 external-id assertions. Use when building or parsing these events, working with the typed tags (RankTag, HopsTag, FollowerCountTag, ServiceProviderTag/ServiceType, …), wiring a consumer that resolves a 10040 provider entry to the 30382s it signs, ranking on assertion values, or touching the GrapeRank publisher, contact-card nicknames, or the trust projection of an external store.
searchable-events
by vitorpamplona
The NIP-50 indexing surface of Quartz — the SearchableEvent interface, which event kinds are searchable, exactly what text each kind's indexableContent() contributes, how the SQLite/filesystem stores consume it, and the NIP-50 SearchQuery extension grammar plus SearchRelayListEvent (kind 10007). Use when making a kind searchable, changing what a kind indexes, diffing the searchable set at a Quartz version bump (external search engines mirror this table), debugging why an event is or isn't found by search, or working with search extensions (include:spam, domain:, …).
event-store-semantics
by vitorpamplona
The authoritative behavioral contract of Quartz's event stores — IEventStore and its reference SQLite implementation (nip01Core/store/sqlite/). Use when implementing or asserting parity with a Quartz event store (external engines like Vespa, the filesystem store, geode), answering filter-semantics questions (since/until inclusivity, tag OR/AND, multi-filter limits, ordering tiebreaks), or working on the write-path rules for replaceable/addressable supersession, NIP-09 deletions, NIP-40 expiration, NIP-62 vanish, NIP-45 counts, or NIP-50 search inside the store. Every behavior has a named rule id (STORE-Fxx/Wxx/Dxx/Sxx/Cxx) so downstream implementations can annotate divergences precisely.
nostr-expert
by vitorpamplona
Nostr protocol implementation patterns in Quartz (AmethystMultiplatform's KMP Nostr library). Use when working with: (1) Nostr events (creating, parsing, signing), (2) Event kinds and tags, (3) NIP implementations (80+ NIP packages in quartz/), (4) Event builders and TagArrayBuilder DSL, (5) Nostr cryptography (secp256k1, NIP-44 encryption), (6) Relay communication patterns, (7) Bech32 encoding (npub, nsec, note, nevent), (8) Resolving user input (hex, npub, nprofile, or NIP-05 name@domain internet identifiers) to a pubkey. Complements nostr-protocol agent (NIP specs) - this skill provides Quartz codebase patterns and implementation details.
ngit-pr
by vitorpamplona
How to create, review, revise, and merge pull requests in this repo, which can be published TWO ways — GitHub (the gh CLI) and git-over-nostr (the ngit CLI, where PRs are nostr proposals reviewed on gitworkshop.dev). Use whenever a task involves opening/updating/merging a PR by either mechanism, the pr/feat/* branches, the ngit or gh CLIs, gitworkshop.dev, or a nostr:// remote. Remote names vary per clone (and a collaborator may have only one) — this skill identifies remotes by URL, and covers the three-mains alignment gate the nostr flow depends on.
amy-expert
by vitorpamplona
Patterns for extending amy, the Amethyst CLI in cli/. Use when adding an amy <verb> command, touching files under cli/src/main/kotlin/…/cli/, wiring a new subcommand into Main.kt, writing an interop test script that drives Amy, or extracting logic out of amethyst/ into commons/ so a CLI command can call it. Enforces the thin-assembly-layer rule (no Nostr protocol or business logic inside cli/), the dual-output contract (text by default, single-line JSON object on stdout under --json, exit codes 0/1/2/124), and the extract-from-Android recipe. Complements nostr-expert (protocol in Quartz), kotlin-multiplatform (expect/actual for extraction), and feed-patterns / account-state / relay-client (where the business logic should end up). NOT for general Nostr or Kotlin work — those have their own skills.
android-expert
by vitorpamplona
Android platform patterns for the amethyst/ module. Use when working with (1) Android navigation (Navigation Compose, type-safe routes, bottom nav), (2) runtime permissions (camera, notifications, biometrics), (3) platform APIs (Intent, Context, Activity, ContentResolver), (4) Material3 theming and edge-to-edge UI, (5) AndroidManifest.xml and intent filters, (6) Proguard/R8 and APK optimization, (7) Android lifecycle (ViewModel, collectAsStateWithLifecycle), (8) Coil image loading. Delegates shared composables to compose-expert, build files to gradle-expert, and KMP structure to kotlin-multiplatform.
gradle-expert
by vitorpamplona
Build optimization, dependency resolution, and multi-module KMP troubleshooting for AmethystMultiplatform. Use when working with: (1) Gradle build files (build.gradle.kts, settings.gradle), (2) Version catalog (libs.versions.toml), (3) Build errors and dependency conflicts, (4) Module dependencies and source sets, (5) Desktop packaging (DMG/MSI/DEB), (6) Build performance optimization, (7) Proguard/R8 configuration, (8) Common KMP + Android Gradle issues (Compose conflicts, secp256k1 JNI variants, source set problems).
auth-signers
by vitorpamplona
Signer abstraction patterns in Amethyst. Use when working with event signing, choosing between a local keypair (NostrSignerInternal), a remote NIP-46 bunker signer (NostrSignerRemote), or a NIP-55 Android external-app signer (NostrSignerExternal). Covers the abstract NostrSigner base class, SignerResult contract, how to wire a new flow that needs to sign events, and the security/UX trade-offs between signer kinds.
account-state
by vitorpamplona
Account state and in-memory event store patterns in Amethyst. Use when working with Account.kt (per-user state objects — kind3FollowList, nip65RelayList, muteList, bookmarkState, each exposing a .flow StateFlow), LocalCache (the object-level event store backed by LargeCache), User/Note model classes, or any ViewModel that reads user-specific state. Covers how account events cascade from relay arrival to UI state, how to add a new account-scoped setting, and when to read from LocalCache vs subscribe to a StateFlow.
feed-patterns
by vitorpamplona
Feed composition and data-access layer patterns in Amethyst. Use when adding or modifying a feed (home, profile, hashtag, bookmarks, notifications, DMs, communities), working with the shared FeedFilter / AdditiveFeedFilter / ChangesFlowFilter / FeedContentState in commons/.../ui/feeds/, the Android-only AdditiveComplexFeedFilter / FilterByListParams in amethyst/.../ui/dal/, or extending the FeedViewModel family in commons/.../viewmodels/. Covers how feeds scan LocalCache, react to changes, apply ordering, and render through Compose.
desktop-expert
by vitorpamplona
Compose Multiplatform Desktop patterns for the desktopApp/ module. Use when working with (1) Desktop-only APIs (Window, WindowState, Tray, MenuBar, Dialog), (2) keyboard shortcuts and menu systems with OS-aware conventions (Cmd vs Ctrl, isMacOS branching), (3) desktop navigation (NavigationRail/sidebar vs Android bottom nav, multi-window), (4) file system integration (file pickers, drag-and-drop, Desktop.getDesktop()), (5) OS-specific behavior on macOS/Windows/Linux, (6) desktop UX principles (keyboard-first, tooltips). Delegates shared composables to compose-expert, build/packaging to gradle-expert, and source-set structure to kotlin-multiplatform.
kotlin-expert
by vitorpamplona
Advanced Kotlin patterns for AmethystMultiplatform. Flow state management (StateFlow/SharedFlow), sealed hierarchies (classes vs interfaces), immutability (@Immutable, data classes), DSL builders (type-safe fluent APIs), inline functions (reified generics, performance). Use when working with: (1) State management patterns (StateFlow/SharedFlow/MutableStateFlow), (2) Sealed classes or sealed interfaces, (3) @Immutable annotations for Compose, (4) DSL builders with lambda receivers, (5) inline/reified functions, (6) Kotlin performance optimization. Complements kotlin-coroutines agent (async patterns) - this skill focuses on Amethyst-specific Kotlin idioms.
kotlin-types-value-class
by vitorpamplona
Use when writing or reviewing Kotlin type declarations to choose @JvmInline value class over data class where appropriate, including Compose stability implications. Technique-layer skill — complements the codebase-specific kotlin-expert.
kotlin-flow-state-event-modeling
by vitorpamplona
Use when writing or reviewing Kotlin StateFlow/SharedFlow/Channel choices, sentinel default values, stateIn placement, WhileSubscribed staleness, or MutableStateFlow update patterns. Technique-layer skill — complements the codebase-specific kotlin-expert.
compose-stability-diagnostics
by vitorpamplona
Use when writing or reviewing Jetpack Compose parameter stability, compiler reports, skippability, unstable UI state classes, collection parameters, or Kotlin 2.0+ strong skipping behavior. Technique-layer skill — complements the codebase-specific compose-expert and kotlin-expert.
compose-slot-api-pattern
by vitorpamplona
Use when designing or reviewing a reusable Jetpack Compose component whose visual regions vary by caller, or when primitive content parameters and boolean shape flags are accumulating. Technique-layer skill — complements the codebase-specific compose-expert.
compose-state-deferred-reads
by vitorpamplona
Use when Jetpack Compose code reads scroll, animation, gesture, or other frame-rate State in composition, passes changing values across composable boundaries, or uses value-form layout/draw modifiers. Technique-layer skill — complements the codebase-specific compose-expert.
compose-recomposition-performance
by vitorpamplona
Use when investigating Jetpack Compose recomposition performance, skippable/restartable composables, composables.txt or compiler reports, Layout Inspector recomposition counts, or frame-rate State reads in composition vs layout/draw, and it is not yet clear whether the cause is parameter stability or deferred reads. Technique-layer skill — complements the codebase-specific compose-expert.
compose-side-effects
by vitorpamplona
Use when writing or reviewing Jetpack Compose code with LaunchedEffect, DisposableEffect, SideEffect, rememberCoroutineScope, rememberUpdatedState, snapshotFlow, snackbar, navigation, focus requests, analytics, or event Flow collection. Technique-layer skill — complements the codebase-specific compose-expert.