Noma
iOS + Android · Native mobile CMS · 2026

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.

Positioning

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.

Architecture

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 });
}
Cross-platform content model

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.

Offline and sync

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.

Release safety

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);
Automation

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.

Next steps

Continue with platform-specific guides

Now available

Start building with Noma

Create a free account, spin up a project, and ship structured content with our API, SDK, and AI tools.