Quickstart
Go from zero to remotely managed strings: create a project, publish your first string with the CLI, and see it update live in your app.
Sign up
Create your account at app.airstrings.com. Signing up creates your organization.
Install the CLI and create a project
npm install -g @airstrings/clibrew install symbionix-sl/airstrings/airstringsThen run init in your app's directory:
cd my-app
airstrings initinit opens the browser so you can approve the login (an owner of the organization approves), creates a project named after the folder, and stores the workspace in .airstrings/config.json. Every new project comes with two environments:
staging: open for direct edits. You publish here first.initmakes it the active environment.production: protected. Direct edits and publishes are rejected; changes reach it only by promotion fromstaging.
init for you. Without a terminal, init opens the browser and waits up to 90 seconds for you to approve; if it exits 9, approve the printed URL and re-run the same command. Already have a project? Run airstrings init --project <id>, or airstrings init <project-key> with a key from the project's API Keys page.Publish your first string with the CLI
Create a string and publish it:
airstrings strings set welcome.title --format text --push en="Welcome to AirStrings"
airstrings publish enYour en bundle is now signed and live in staging.
Add the SDK to your app
airstrings sdk-config --env staging prints the organization, project and environment IDs and the public key for staging, with a ready-to-paste initializer. The SDKs use these to fetch and verify bundles; all of them are public.
Add the package in Xcode (File > Add Package Dependencies) or in Package.swift:
dependencies: [
.package(url: "https://github.com/symbionix-sl/airstrings-sdk-ios.git", from: "1.2.0")
]Create an AirStrings instance at app launch and read your string:
import AirStrings
let airStrings = AirStrings(configuration: .init(
organizationId: "org_a1b2c3d4e5f6",
projectId: "proj_a1b2c3d4e5f6",
environmentId: "env_a1b2c3d4e5f6",
publicKeys: ["BASE64_ED25519_PUBLIC_KEY"]
))
let title = airStrings["welcome.title"]SwiftUI injection, ICU formatting, and caching details are in the iOS SDK guide.
Add JitPack to your repositories in settings.gradle.kts, then add the dependency:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven("https://jitpack.io")
}
}dependencies {
implementation("com.github.symbionix-sl:airstrings-sdk-android:v1.2.0")
}Create an AirStrings instance and read your string:
import com.airstrings.sdk.AirStrings
import com.airstrings.sdk.AirStringsConfiguration
val config = AirStringsConfiguration(
organizationId = "org_a1b2c3d4e5f6",
projectId = "proj_a1b2c3d4e5f6",
environmentId = "env_a1b2c3d4e5f6",
publicKeys = listOf("BASE64_ED25519_PUBLIC_KEY"),
)
val airStrings = AirStrings.create(applicationContext, config)
val title = airStrings["welcome.title"]Compose integration, ICU formatting, and caching details are in the Android SDK guide.
Install the package:
npm install @airstrings/webCreate an AirStrings instance and read your string:
import { AirStrings } from '@airstrings/web'
const airstrings = new AirStrings({
organizationId: 'org_a1b2c3d4e5f6',
projectId: 'proj_a1b2c3d4e5f6',
environmentId: 'env_a1b2c3d4e5f6',
publicKeys: ['BASE64_ED25519_PUBLIC_KEY'],
locale: 'en',
})
const title = airstrings.t('welcome.title')Update events, ICU formatting, and caching details are in the Web SDK guide.
0.x): its public API may change in a minor release. iOS, Android, Web, and Go are stable 1.x.Install the package and its AsyncStorage peer dependency:
npm install @airstrings/react-native @react-native-async-storage/async-storageCreate an AirStrings instance and read your string:
import { AirStrings } from '@airstrings/react-native'
const airstrings = new AirStrings({
organizationId: 'org_a1b2c3d4e5f6',
projectId: 'proj_a1b2c3d4e5f6',
environmentId: 'env_a1b2c3d4e5f6',
publicKeys: ['BASE64_ED25519_PUBLIC_KEY'],
locale: 'en',
})
const title = airstrings.t('welcome.title')React bindings, ICU formatting, and caching details are in the React Native SDK guide.
Add the module:
go get github.com/symbionix-sl/airstrings-sdk-go@latestCreate one Client per process, then a Localizer per request, and read your string:
import "github.com/symbionix-sl/airstrings-sdk-go"
client, err := airstrings.New(airstrings.Config{
OrganizationID: "org_a1b2c3d4e5f6",
ProjectID: "proj_a1b2c3d4e5f6",
EnvironmentID: "env_a1b2c3d4e5f6",
PublicKeys: []string{"BASE64_ED25519_PUBLIC_KEY"},
Locales: []string{"en"},
})
if err != nil {
log.Fatal(err)
}
defer client.Close()
title := client.Localizer("en", "").T("welcome.title")Per-request locales, ICU formatting, and caching details are in the Go SDK guide.
Strings load asynchronously: until the first verified bundle arrives, lookups fall back to the key name. Once loaded, strings are cached on device and keep working offline.
Change it live
Update the string and publish again:
airstrings strings set welcome.title --format text --push en="Hello from the cloud"
airstrings publish enSend your app to the background and bring it back to the foreground (or refocus the browser tab). The SDK refreshes, verifies the new bundle, and your UI shows the new copy. No rebuild, no release.
Ship to production
When the copy is ready, switch the environment selector to production, open Promote, pick staging as the source, review the diff, and promote. Promoted strings are signed and published to production immediately.
For your release builds, point the SDK at the production environment ID and public key: airstrings sdk-config --env production prints them with a ready-to-paste initializer (also in Project Settings > SDK Configuration).
Introduction
AirStrings is remote string management for apps: edit copy in a dashboard or from the CLI and ship it to users without an app release.
Projects, Environments, and Promotion
How organizations, projects, and environments organize your strings, and how promotion moves changes between environments without retyping.