Get started

Kickstart Signal uses the same account, app registration, and API key as Kickstart Exchange. If your app is already registered, there is one switch to flip. If not, registering takes a few minutes plus a human review.

Enable Signal for your app

Sign in to your Kickstart dashboard, open the app, and choose the Signal tab. Select Enable Signal to create the app’s board. The same tab holds the board’s settings: whether comments and voting are on, the theme colors the SDK uses, and the board’s default language.

To register a new app, choose Add an app and paste its App Store link. If its App Store developer ID has not already been verified for your account, we’ll give you a short verification code to publish on the app’s listed website or paste into its App Store promotional text. Apps from a developer ID already verified for your account skip that step. Every app still needs human approval before its API key appears.

Add Kickstart Signal to your app

In Xcode, choose File > Add Package Dependencies, enter https://github.com/twostraws/KickstartSDK, select the latest available version, then link the KickstartSignal product to your app target. The package requires Xcode 26 and supports iOS 18, iPadOS 18, macOS 15, tvOS 18, visionOS 2, and watchOS 11 or later. If you already use KickstartExchange, it comes from the same package.

Place the board wherever it suits your app. A Suggest a feature row in Settings that pushes to the board is the usual choice:

import KickstartSignal
import SwiftUI

struct FeedbackView: View {
    var body: some View {
        SignalBoardView(apiKey: "ks_live_REPLACE_WITH_API_KEY")
    }
}

The API key is on the app’s Integration tab, and it is the same key Kickstart Exchange uses. It identifies your app rather than you: it ships inside the binary, grants no access to your dashboard, and can be reissued at any time. Reissuing it moves Exchange and Signal to the new key together.

The first time the board loads, the SDK creates a random identifier for that installation and keeps it locally. It exists so a vote counts once and so a user can see their own submissions. It is not tied to the person, the device, or an Apple ID, and there is no API for attaching anything to it.

Customizing the board

The board follows your app’s light or dark appearance on its own. Beyond that, SignalBoardView takes configuration values for the theme colors it uses for buttons, vote controls, and status badges, and for which features appear: whether comments are shown, whether the list expands descriptions, and whether voting is available. Comments and voting can also be switched off for the whole board from the dashboard, which overrides the app.

All visible text is localized, and users can filter to open or closed requests and sort by votes or by newest. Where Apple’s Translation framework is available, they can translate a request into their own language on the device.

Using the client directly

If you want your own interface, SignalClient exposes everything the board does as async calls:

let client = SignalClient(apiKey: "ks_live_REPLACE_WITH_API_KEY")

let requests = try await client.listRequests(sort: .votes, status: .open)
let comments = try await client.listComments(requestID: requests[0].id)

try await client.vote(requestID: requests[0].id)
try await client.createRequest(
    title: "Shortcuts actions",
    description: "Let me log an entry from a Shortcut or Siri."
)
  • listRequests(sort:status:) returns approved requests, ranked by votes, newest first, or by status.
  • createRequest(title:description:) submits a private request for your review. Tell the user it awaits approval.
  • vote(requestID:) and removeVote(requestID:) set or clear this installation’s vote. Repeating either is harmless.
  • listComments(requestID:) and createComment(requestID:body:) read approved comments and submit a new one for review.

Errors arrive as SignalError cases you can show to users safely. Debug builds also print a diagnostic when the key is wrong or the board is disabled, so a misconfiguration is obvious in Xcode rather than silent in the App Store.

Moderation

Every new request and comment starts private. The Signal tab shows them as a queue, where you can approve, edit, reject, or merge each one. Approving publishes it to everyone using the app; editing first is fine, and expected for typos or vague titles. Merging folds a duplicate into the request you keep and records the merge.

Published requests carry a status: open, planned, in progress, or shipped. Each change is recorded with its date, and users see the current status as a badge. Your own comments are published immediately and marked as coming from the developer, so replying takes one step. You can unpublish or delete anything you previously approved, and the API never returns content you have not approved.

Complete App Privacy in App Store Connect

Kickstart Signal’s privacy manifest declares Identifiers: User ID, Usage Data: Product Interaction, and User Content: Other User Content. All three are collected for app functionality only, are not linked to the user’s identity, and are not used for tracking. Follow these steps for the version of your app that includes Kickstart Signal:

  1. In App Store Connect, choose Apps, select your app, then select App Privacy in the sidebar.
  2. If App Privacy has not been set up yet, select Get Started, choose Yes, we collect data from this app, then select Next. Otherwise, select Edit next to Data Types.
  3. Under Identifiers, select User ID. Under Usage Data, select Product Interaction. Under User Content, select Other User Content. Save your selections or continue when prompted.
  4. Open each of those three data types in turn. Select App Functionality as the purpose. Answer No when asked whether the data is linked to the user’s identity, answer No when asked whether it is used for tracking, then save.
  5. Review the Product Page Preview, select Publish, then confirm Publish.

Do not remove any disclosure required by your app or another SDK. Do not select Name, Email Address, Device ID, Purchase History, or any Location data type solely for Kickstart Signal. Your app must provide its own complete privacy-policy URL that mentions Kickstart Signal and links to the Kickstart Signal privacy notice.

Apple can change App Store Connect, so compare these answers with Apple’s current App Privacy guidance before publishing.

Your data

The account page offers two Signal actions. Download Signal data prepares one compressed JSON file containing your boards, requests, comments, votes, statuses, and moderation history, and shows a download link when it is ready. The file expires, so download it promptly. Delete all Signal data removes every board and everything on it immediately, and leaves your Kickstart account, your registered apps, and Kickstart Exchange untouched. Both actions ask you to sign in again if your session is more than a few minutes old.

Deleting an app from your dashboard removes its Signal board with it, and deleting your account removes Exchange participation and Signal boards together. The confirmation for each says so before anything is deleted.

What each board status means

  • Not enabled: the app is registered, but you haven’t switched Signal on yet. The SDK shows nothing.
  • Enabled: the board is live, and the SDK is serving approved requests to your users.
  • Disabled: you switched the board off. Its content is kept, and the SDK shows nothing until you enable it again.
  • Suspended: the app or account is suspended across every Kickstart service, and its Overview page explains why.