Skip to content

Releases

0.48.0

Choose a tag to compare

@github-actions github-actions released this 09 Nov 20:54
e673f71
  • 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:) (Kotlin articlesAbout)
    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, and submitOpEd(...) sends one.
    Articles carry the publication's disclosure (show it above the article) and teaser (link to canonicalUrl
    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.graphql is the API's consumer schema as of next, with Soapbox.

0.47.0

Choose a tag to compare

@github-actions github-actions released this 09 Nov 20:30
2b2a4b6
  • 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. DiscordConnection makes the
    verifier and the API's authorize URL and reads the audiencekit-discord://callback hand-back;
    connectDiscord(...) posts it with connect: true and stores the session the API returns; connectedDiscord()
    reads me { self { signedInWithDiscord discordUsername } } (nil on an API older than those fields). iOS also gets
    AudienceKitUI's ConnectDiscordButton (iOS 16.4+, ASWebAuthenticationSession); Android apps declare an intent
    filter for scheme audiencekit-discord, host callback. ConnectDiscordCopy keeps both apps' words the same.
    Needs audience_kit_api #427.

0.46.2

Choose a tag to compare

@github-actions github-actions released this 08 Nov 03:16
44e4f2a
  • 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>/staffql stays the same sign-in scoped to one audience. No code change.

0.46.1

Choose a tag to compare

@github-actions github-actions released this 08 Nov 03:06
708e094
  • DeleteAccountCopy warning (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-audience deleteAccount; this replaces 0.45.1's "every app" wording.

0.46.0

Choose a tag to compare

@github-actions github-actions released this 08 Nov 02:38
129a758
  • GraphQLEndpoint can 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

Choose a tag to compare

@github-actions github-actions released this 08 Nov 00:12
fab5fd3
  • DeleteAccountCopy warning (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

Choose a tag to compare

@github-actions github-actions released this 07 Nov 19:19
63422b1

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 (Swift reportContent(_:id:reason:block:), Kotlin reportContent(targetType, targetId, reason, block)) with ReportTarget and ReportResult: files a report with the audience's admins, and can block the person
    behind it in the same call.
  • blockUser / unblockUser for a member's user id.
  • ReportCopy (Swift and Kotlin): the same report and block wording, and report reasons, on both platforms.

0.44.0

Choose a tag to compare

@github-actions github-actions released this 07 Nov 19:19
d3d7f87

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 and signedOut is 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

Choose a tag to compare

@github-actions github-actions released this 07 Nov 19:19
cf74603

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:) and eventSeries(localeID:venueID:first:) take first as optional and
    leave it out by default, so the API returns every upcoming event at the cost of one.
  • venueDetail shows the venue's next five events (was twenty, also over budget with the chat history).

0.41.0

Choose a tag to compare

@github-actions github-actions released this 06 Nov 20:04
0432ca9

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, as AdmissionOffer with price, URL and seller) and Event.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).