Files
amethyst/.claude/skills/quartz-integration/references/gradle-setup.md
T
Vitor PamplonaandClaude Opus 5 e9e510b831 chore(release): bump to 1.15.0
app 1.14.0 -> 1.15.0, appCode 457 -> 458. That single edit drives Android's
versionName/versionCode, Desktop and CLI packageVersion, quartz's Maven version
and geode's RelayInfo.VERSION.

RELEASE_NOTES_ID is repointed at the v1.15.0 note
(8fce45589ea44df75e828a04c7d70bb4fabedd6ffc1946a920b2f0c7c990ff9f), which
RELEASE_OPS notes happens on x.y.0 releases and not on patches. It has to ship
in this commit rather than after it: the drawer's "Release Notes" link and the
donation card both open BuildConfig.RELEASE_NOTES_ID, so a tag cut before the
repoint ships users a link to the previous release's note. Verified present on
relay.damus.io and relay.primal.net before committing.

Adds docs/changelog/v1.15.00.md, written from the 556 commits since v1.14.0,
and its index entry. The cycle's headline is the Marmot resync: the MIP
documents were deprecated in July and MDK followed, leaving our implementation
invalid under either profile the current spec defines, so it moves onto the
adopted current profile and is now interoperable with White Noise. Marmot group
chat itself is not new -- it shipped in v1.09.0 -- and the notes say so.

Also syncs the docs that state a version rather than illustrate one, since
quartz and geode both read libs.versions.app:

- README.md, quartz-integration SKILL.md and its gradle-setup.md reference
  -> quartz 1.15.0
- geode/README.md install commands -> geode 1.15.0

The Homebrew/Winget status blocks in BUILDING.md and RELEASE_OPS.md were
re-verified rather than re-stamped, and the claim had gone stale in our favour:
both Homebrew packages are live upstream now. formulae.brew.sh answers 200 for
the amethyst-nostr cask (at 1.14.0) and for the amy formula, while geode-relay
404s and microsoft/winget-pkgs still has no VitorPamplona/Amethyst -- PR #422752
is open pending CLA. Both blocks now say that, RELEASE_OPS gains a geode-relay
row, and the section heading no longer claims Homebrew is not shipping.

Left alone deliberately: everything under */packaging/ and translators.json's
tag, which the bump workflows and the Crowdin job write after the tag exists
(bumping by hand would commit wrong hashes and a dead URL); and
cli/tests/marmot/state/mdk/Cargo.lock, where 1.14.0 is an unrelated crate.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VgVDQQXAg4cmzsWHoJj61k
2026-09-11 16:56:30 -04:00

3.3 KiB

Quartz Gradle Dependency Setup

Current version

com.vitorpamplona.quartz:quartz:1.15.0

Check latest: https://central.sonatype.com/artifact/com.vitorpamplona.quartz/quartz


KMP Project Setup

gradle/libs.versions.toml

[versions]
quartz = "1.15.0"

[libraries]
quartz = { module = "com.vitorpamplona.quartz:quartz", version.ref = "quartz" }

build.gradle.kts (library/app module)

plugins {
    alias(libs.plugins.kotlinMultiplatform)
    alias(libs.plugins.androidKotlinMultiplatformLibrary) // or androidLibrary/androidApplication
}

kotlin {
    jvm()
    androidLibrary {
        namespace = "com.example.myapp"
        compileSdk = 35
        minSdk = 21
    }
    // optional: iOS targets

    sourceSets {
        commonMain.dependencies {
            implementation(libs.quartz)
        }
        // No platform-specific deps needed — Quartz provides them transitively
    }
}

Android-only Project

// build.gradle.kts (app module)
dependencies {
    implementation("com.vitorpamplona.quartz:quartz:1.15.0")
}

JVM (Desktop) standalone

// build.gradle.kts
plugins {
    kotlin("jvm")
}

dependencies {
    implementation("com.vitorpamplona.quartz:quartz:1.15.0")
    // JNA needed for libsodium (NIP-44) on JVM
    implementation("net.java.dev.jna:jna:5.18.1")
}

Transitive Dependencies (what you get automatically)

All platforms (commonMain)

  • org.jetbrains.kotlin:kotlin-stdlib
  • org.jetbrains.kotlinx:kotlinx-coroutines-core
  • org.jetbrains.kotlinx:kotlinx-collections-immutable
  • org.jetbrains.kotlinx:kotlinx-serialization-json
  • androidx.collection:collection (LruCache)
  • androidx.compose.runtime:runtime-annotation (@Immutable/@Stable)
  • fr.acinq.secp256k1:secp256k1-kmp (Schnorr crypto — common)

JVM + Android (jvmAndroid)

  • com.github.anthonynsimon:rfc3986-normalizer (URL normalization)
  • com.fasterxml.jackson.module:jackson-module-kotlin (JSON)
  • com.squareup.okhttp3:okhttp (WebSocket)
  • ru.gildor.coroutines:kotlin-coroutines-okhttp
  • nl.bommber:kchesslib (NIP-64 chess, version pinned to 1.0.0)

JVM only

  • fr.acinq.secp256k1:secp256k1-kmp-jni-jvm
  • com.goterl:lazysodium-java (NIP-44 encryption)
  • net.java.dev.jna:jna

Android only

  • fr.acinq.secp256k1:secp256k1-kmp-jni-android
  • com.goterl:lazysodium-android
  • net.java.dev.jna:jna (aar)
  • androidx.core:core-ktx

Packaging / ProGuard

Quartz ships consumer ProGuard rules automatically (publish = true in the library). You don't need to add manual keep rules for Quartz classes in your app.

For Android release builds, these classes are preserved:

  • All com.vitorpamplona.quartz.** event and model classes
  • Jackson serialization annotations

Common Build Errors

Duplicate class kotlin.collections.jdk8

Add to gradle.properties:

android.useFullClasspathForDexingTransform=true

Could not find lazysodium-java on JVM

Ensure JNA is on the classpath:

implementation("net.java.dev.jna:jna:5.18.1")

iOS: Framework not found quartz-kmpKit

Build the XCFramework first:

./gradlew :quartz:assembleQuartz-kmpKitReleaseXCFramework

Then drag quartz/build/XCFrameworks/release/quartz-kmpKit.xcframework into Xcode.