Skip to main content

Overview

SkyTeam ROBLOX supports multi-brand airlines, allowing a single airline to operate multiple brands with distinct identities. Each brand has unique IATA/ICAO codes, callsigns, and visual branding.

Brand Schema

Brands are stored with comprehensive branding and identification data:
packages/database/src/schema.ts
export const brands = pgTable("brands", {
  brandId: text("brandId").primaryKey(),
  airlineId: text("airlineId")
    .notNull()
    .references(() => airlines.airlineId),
  name: text("name").notNull(),
  iata: text("iata").notNull().unique(),
  icao: text("icao").notNull().unique(),
  callsign: text("callsign").notNull().unique(),
  isPrimary: boolean("isPrimary").notNull().default(false),
  logoUrl: text("logoUrl").default(
    "https://files.skyteam.dev/api/public/dl/kiLB84P2?inline=true",
  ),
  accentColor: text("accentColor").notNull().default("#2ea5f7"),
  secondaryColor: text("secondaryColor").notNull().default("#242429"),
  elementColor: text("elementColor").notNull().default("#fbfbfb"),
});

IATA Codes

2-letter airline designators (e.g., “AA”, “DL”)

ICAO Codes

4-letter airline designators (e.g., “AAL”, “DAL”)

Callsigns

Phonetic callsigns used in ATC communications

Airline Codes

IATA Codes

The International Air Transport Association (IATA) assigns 2-letter codes to airlines worldwide:
  • Must be unique across all brands
  • Used in flight numbers (e.g., “AA123”)
  • Displayed on tickets and booking systems

ICAO Codes

The International Civil Aviation Organization (ICAO) assigns 4-letter codes:
  • Must be unique across all brands
  • Used for air traffic control
  • More formal identification

Callsigns

Phonetic callsigns used in radio communications:
  • Must be unique across all brands
  • Used for voice identification
  • Examples: “American”, “Delta”, “United”

Real-World Standards

SkyTeam ROBLOX follows real-world aviation standards for airline identification.

Brand Colors

Each brand supports three customizable colors:

Accent Color

Primary brand color, used for highlights and CTAs

Secondary Color

Background and supporting elements

Element Color

Text and UI elements

Default Colors

accentColor: "#2ea5f7"      // SkyTeam blue
secondaryColor: "#242429"   // Dark background
elementColor: "#fbfbfb"     // Light text

Primary Brand

Airlines can designate one brand as primary:
packages/database/src/brands.ts
export async function fetchPrimaryBrand(airlineId: string): Promise<Brand | null> {
  const result = await db
    .select()
    .from(brands)
    .where(and(eq(brands.airlineId, airlineId), eq(brands.isPrimary, true)))
    .limit(1);
  return result[0] || null;
}

One Primary Brand

Only one brand per airline can be marked as primary. This is typically the main operating brand.

Fetching Brands

All Brands

Retrieve all brands across the system:
packages/database/src/brands.ts
export async function fetchAllBrands(): Promise<Brand[]> {
  return db.select().from(brands);
}

By Airline

Get all brands for a specific airline:
packages/database/src/brands.ts
export async function fetchAirlineBrands(airlineId: string): Promise<Brand[]> {
  return db.select().from(brands).where(eq(brands.airlineId, airlineId));
}

By IATA Code

Look up a brand by its IATA code:
packages/database/src/brands.ts
export async function fetchBrandByIATA(iata: string): Promise<Brand | null> {
  const result = await db.select().from(brands).where(eq(brands.iata, iata)).limit(1);
  return result[0] || null;
}

By Brand ID

Retrieve a specific brand:
packages/database/src/brands.ts
export async function fetchBrand(brandId: string): Promise<Brand | null> {
  const result = await db.select().from(brands).where(eq(brands.brandId, brandId)).limit(1);
  return result[0] || null;
}

Creating Brands

Create a new brand with all required information:
packages/database/src/brands.ts
export async function createBrand(data: {
  brandId: string;
  airlineId: string;
  name: string;
  iata: string;
  icao: string;
  callsign: string;
  isPrimary?: boolean;
  logoUrl?: string;
  accentColor: string;
  secondaryColor: string;
  elementColor: string;
}): Promise<Brand> {
  const result = await db.insert(brands).values(data).returning();
  return result[0];
}

Flights with Brands

Flights are associated with brands, not airlines directly:
packages/database/src/schema.ts
export const flights = pgTable("flights", {
  // ...
  airlineId: text("airlineId")
    .notNull()
    .references(() => airlines.airlineId),
  brandId: text("brandId")
    .notNull()
    .references(() => brands.brandId),
  // ...
});
This allows flights to display the correct brand identity:
apps/api/src/routes/flight.ts
router.get("/flight/fetchUpcomingFlights", async (_req, res, next) => {
  try {
    const airline = res.locals.airline as { airlineId: string };

    const [flights, brands] = await Promise.all([
      fetchComingFlights(airline.airlineId),
      fetchAirlineBrands(airline.airlineId),
    ]);

    const brandsById = new Map(brands.map((b) => [b.brandId, b]));
    const withBrand = flights.map((f) => ({
      ...f,
      brand: brandsById.get(f.brandId) || null,
    }));

    res.json(withBrand);
  } catch (err) {
    next(err);
  }
});

Use Cases

Multi-Brand Airlines

Operate regional carriers or subsidiary brands under one airline

Code Sharing

Partner with other airlines while maintaining brand identity

Fleet Variations

Use different brands for different aircraft types or routes

Visual Identity

Customize colors and logos for each brand’s unique look

Best Practices

1

Unique Codes

Ensure IATA, ICAO, and callsign codes are unique across all brands
2

Meaningful Names

Use clear, descriptive brand names that players will recognize
3

Consistent Colors

Follow your brand guidelines for consistent visual identity
4

Logo Quality

Use high-quality logo images with transparent backgrounds
5

Primary Brand

Designate your main operating brand as primary

Next Steps

Learn About Flights

Discover how flights use brand information for display and tracking

Build docs developers (and LLMs) love