CMS for iOS and Android
Noma gives native mobile teams one API-first content platform for both iOS and Android with secure backend access, localization, and release-safe content operations.
Why native teams use Noma
Native apps often share product strategy but differ in implementation details. Noma lets teams manage one structured content model and serve platform-specific payload variants where required.
This approach reduces duplicate editorial effort and keeps rollout controls centralized across both mobile apps.
Use a shared backend-for-frontend layer
Keep all Noma credentials on server infrastructure. iOS and Android clients should call a mobile API layer that handles auth, shaping, caching, and policy.
// backend/lib/noma.ts
import { createClient } from "@nomacms/js-sdk";
export function getNomaServerClient() {
const projectId = process.env.NOMA_PROJECT_ID;
const apiKey = process.env.NOMA_API_KEY;
if (!projectId || !apiKey) throw new Error("Missing Noma env vars");
return createClient({ projectId, apiKey });
}// backend/routes/mobile-home.ts
export async function mobileHome(req, res) {
const platform = String(req.query.platform ?? "ios"); // ios | android
const locale = String(req.query.locale ?? "en");
const noma = getNomaServerClient();
const result = await noma.content.list("home_feed", {
state: "published",
locale,
paginate: 20,
sort: "created_at:desc",
});
const items = "data" in result ? result.data : result;
const payload = items.map((item) => ({
id: item.uuid,
title: item.fields?.title,
cta: platform === "android" ? item.fields?.cta_android : item.fields?.cta_ios,
}));
res.json({ items: payload });
}Shared schema with platform variants
Model shared fields once and add optional platform-specific fields where native UX diverges. Keep collection and field naming stable so both app teams can evolve safely over time.
Consistent behavior across iOS and Android
Use local-first reads and background sync on both platforms so UX remains resilient in weak network conditions. Standardize sync intervals and conflict rules to avoid platform drift.
Publish and rollback without binary redeploys
Product copy, configuration, and campaign content can be released independently of app binaries using Noma's draft/publish/version controls.
// backend/content-release.ts
await noma.content.patch("mobile_config", configUuid, {
data: { onboarding_message: "Welcome to version 3.2" },
});
await noma.content.publish("mobile_config", configUuid);
const versions = await noma.content.versions.list("mobile_config", configUuid);
await noma.content.versions.revert("mobile_config", configUuid, versions[0].uuid);Mobile operations with MCP
Use @nomacms/mcp-server and Agent Skills to automate recurring mobile content tasks such as locale setup, bulk updates, and QA checks.