Repository navigation
Releases
0.48.0
- Soapbox (Swift and Kotlin): articles from the audience's publications (a newspaper such as QSaltLake, a candidate)
and op-eds readers send them.articles(localeID:publicationID:first:)is a locale's or a publication's news,
article(id:)reads one with its Markdown body and what it's about,articles(about:)(KotlinarticlesAbout)
lists a venue's, event's, person's or locale's "In the news",publications()/publication(id:)back a
publication page,myOpEds()shows where the signed-in person's op-eds stand, andsubmitOpEd(...)sends one.
Articles carry the publication'sdisclosure(show it above the article) andteaser(link tocanonicalUrl
instead of a body). Audiences without the Soapbox module get empty lists and nil, never an error.SoapboxCopy
keeps the apps' words the same. Needs audience_kit_api #436 (on next). graphql/schema.graphqlis the API's consumer schema as of next, with Soapbox.
0.47.0
- Connect Discord (Swift and Kotlin): someone who signed in another way (Sign in with Apple, say) connects their
Discord account so the audience's Discord bridge knows them as the same person.DiscordConnectionmakes the
verifier and the API's authorize URL and reads theaudiencekit-discord://callbackhand-back;
connectDiscord(...)posts it withconnect: trueand stores the session the API returns;connectedDiscord()
readsme { self { signedInWithDiscord discordUsername } }(nil on an API older than those fields). iOS also gets
AudienceKitUI'sConnectDiscordButton(iOS 16.4+, ASWebAuthenticationSession); Android apps declare an intent
filter for schemeaudiencekit-discord, hostcallback.ConnectDiscordCopykeeps both apps' words the same.
Needs audience_kit_api #427.
0.46.2
- The audience-less endpoint's docs and tests name the API's
/v1/staffql: selfQL (/v1/selfql) is gone (Rick,
2026-11-08). The pathed/v1/audience/<id>/staffqlstays the same sign-in scoped to one audience. No code change.
0.46.1
DeleteAccountCopywarning (Swift and Kotlin) now says deleting removes the account in this app only, with any
staff or admin role in it, and leaves the person's accounts in other AudienceKit apps alone. Account deletion is per
audience (Rick, 2026-11-08): an app built on AudienceKit can't wipe what someone did in another app. Needs
audience_kit_api's per-audiencedeleteAccount; this replaces 0.45.1's "every app" wording.
0.46.0
GraphQLEndpointcan be audience-less (GraphQLEndpoint(rawValue:audienceless:)in Swift,audienceless = true
in Kotlin): its path is/v1/<segment>and calls to it need no audience. StaffKit uses it for the API's
/v1/selfql, where Backstage and Velvet work on a listing of one's own in no audience or any number of them
(Rick, 2026-11-08).path(audienceID:)takes an optional ID.
0.45.1
DeleteAccountCopywarning (Swift and Kotlin) now says deleting removes the account in every AudienceKit app,
including Hot Mess and Hack Different, and any staff or admin roles, since accounts are shared across apps.
0.45.0
Report and block in the SDK (Rick, 2026-11-07, for Hack Different's Google Play and App Store review: Play's
user-generated content policy and App Store guideline 1.2), so apps stop hand-writing them as Hot Mess did.
reportContent(SwiftreportContent(_:id:reason:block:), KotlinreportContent(targetType, targetId, reason, block)) withReportTargetandReportResult: files a report with the audience's admins, and can block the person
behind it in the same call.blockUser/unblockUserfor a member's user id.ReportCopy(Swift and Kotlin): the same report and block wording, and report reasons, on both platforms.
0.44.0
Delete account in the SDK (Rick, 2026-11-07, for Hack Different's App Store review: guideline 5.1.1(v) and Google
Play's account deletion rule), so apps stop hand-writing it as Hot Mess did.
deleteAccount()on the client (Swift and Kotlin):deleteAccount(input: { confirm: true }). When the API says the
account is gone, the session is forgotten on this device andsignedOutis sent; otherwise they stay signed in.- SwiftUI:
DeleteAccountButton(client:appName:onDeleted:)asks first, shows progress and errors. DeleteAccountCopy(Swift and Kotlin): the same confirmation and failure wording on both platforms.
0.41.1
Hack Different's events came back empty: events() and eventSeries() asked for first: 100, and the API costs a
page as first times an event (about 75 with every module), far over its 1000 complexity budget, so the query was
refused. Fixed.
events(window:localeID:venueID:first:)andeventSeries(localeID:venueID:first:)takefirstas optional and
leave it out by default, so the API returns every upcoming event at the cost of one.venueDetailshows the venue's next five events (was twenty, also over budget with the chat history).
0.41.0
What Hack Different still queried itself after moving to 0.40, so the app can drop its last ticketing queries.
Additive.
- Events carry their offers:
Event.ticketOffers(every way in on sale, whichever module sells it: tickets on partner
listings and the night's cover, asAdmissionOfferwith price, URL and seller) andEvent.coverCharge(the Cover
module's charge for that night). Both are nil where the audience doesn't have the module. venueOffers(venueID:night:)lists every way into a venue on a night (tonight by default).venueCover(venueID:)follows the audience's modules too: without Ticketing or Cover it returns the venue with no
charge instead of failing.venueDetail(id:recentMessages:)takes how many chat messages to load (20 by default, the API's most).