Skip to content
PressboardKit
LicensingBrowse docs

Getting started

Licensing

PressboardKit is free, but it is licensed. What you have to do today, what the engine does about it, and what it never does.

PressboardKit is free. There is no charge for a licence, no tier above the one everybody gets, and no capability held back for one.

It is licensed rather than open, though. You register an application — its product name and bundle identifier — and a licence is issued against it. See Access for the terms and Contact to register; that is by email at the moment, because the dashboard that replaces it is still being built.

What you have to do today

Two things, neither of them in code:

  1. Register, and hold the licence issued to you.
  2. Nothing else.

There is no key to paste, no activation call to make, and no setup step to add. Your integration is the one in the quick start — unchanged.

What the engine does about it today

Nothing is enforced yet. The core module carries a licensing seam so that a validating build can fill it in without restructuring anyone’s call sites:

public struct LicenseGate: Sendable {
    public init(allow: @escaping @Sendable (String) -> Bool = { _ in true })
    public func isUnlocked(_ feature: String) -> Bool

    /// The default: everything unlocked.
    public static let unrestricted = LicenseGate()

    /// Everything a licence covers, at once.
    public static let everything = "*"
}

Note what it is not: it takes a closure, not a licence key, and .unrestricted — the default — answers true for every feature.

A later build validates an issued licence at setup, the way KeyboardKit does. That will be additive: an activation step you add, not an API that changes underneath you.

How validation will work

Worth reading before you adopt the engine, because the shape of it is a term of the licence rather than an implementation detail we can change quietly.

  • Your containing app exchanges its licence key for a signed licence lease naming the product name and bundle identifier the licence was issued against, and writes it to the App Group the extension shares.
  • The keyboard extension verifies that signature offline, against a key compiled into the engine.
  • The keyboard extension never opens a network connection. It contains no code that could — which is also why the lease is fetched by the containing app rather than by the keyboard.
  • What leaves your application is the licence key and the bundle identifier. No text you or your users type, no keystrokes, no device identifier and no identifier of an individual installation are sent to us, at any point, by any part of the engine.
  • Every deadline the engine enforces arrives inside the lease rather than compiled into it, so a mistake of ours can be corrected without you shipping a build.

It fails open

The rule the whole design rests on, and the one to hold us to: the floor is a working keyboard and there is nothing below it.

No lease, an unreadable one, a signature that does not verify, a bundle identifier that does not match, a clock that moved backwards, a service of ours that is down — every one of those leaves the free tier running. None of them throws, none of them blocks, and none of them produces an empty keyboard. Somebody mid-sentence in your app is not a person any licensing decision of ours gets to interrupt.

If the terms ever change

They can — section 8 of the licence reserves that, as licences generally do, and sets the notice we owe you: at least three months in writing to your registration address before a change that would require you to start paying for something that was free.

What that section is worth reading alongside is section 7: an application you have already published goes on working. If you did not accept a change, what continues is the free tier — English and native rendering — in shipped apps and new builds alike, and we will not ask you to withdraw anything.

Edit this page on GitHub