Skip to main content

The add-on manifest

Welcome to your first step in building an EMET Surf add-on! We'll start by creating the manifest - the heart of your add-on that tells the app everything it needs to know.

The manifest is a JSON file that lives at /manifest.json on your server. Think of it as your add-on's business card - it introduces your add-on to EMET Surf and explains what it can do.

Creating your first manifest​

Here's the minimal manifest you need to get started:

{
"id": "my.first.emet.addon",
"version": "1.0.0",
"name": "Hello, World",
"description": "My first EMET Surf add-on",
"logo": "https://example.com/logo-256.png",
"resources": [],
"types": []
}

This is the basic skeleton. Let's break down what each field means:

Required fields:

  • id: A unique identifier for your add-on. Use a dot-separated format like com.example.movies or mycompany.tvshows
  • version: Follows Semantic Versioning (like "1.0.0", "2.1.3")
  • name: What users will see as your add-on's name
  • description: Explains what your add-on does and what content users can expect

Optional but recommended:

  • logo: A 256×256 pixel square image that represents your add-on. This makes it look professional and recognizable

Coming soon:

  • resources: What your add-on provides (catalogs, metadata, streams, etc.)
  • types: What kinds of content you support (movies, series, etc.)

We'll add these in the next steps as we build functionality.

Advanced manifest features​

EMET Surf supports several optional features to make your add-on more powerful and user-friendly:

Redirectable manifests:

{
"location": ["https://my-addon-server.com/manifest.json"]
}

This lets you host your public manifest separately from your content servers. Users install from the public URL, but your actual add-on runs on different servers.

Supported features

Here you list all features your add-on supports. EMET Surf uses extraSupported list to know how and when to use your add-on. For instance, it will only query your add-on for EPG if there is epg in the list of supported features. This way EMET Surf avoids sending unnecessary requests to add-ons.

{
"extraSupported": [
"epg",
"contentLanguage",
"withSeasons",
"withTrailers"
]
}
  • epg: Add-on provides EPG in meta endpoint output
  • contentLanguage: Add-on accepts language query parameter to output data in the specified language
  • withSeasons: Add-on accepts withSeasons query parameter to include seasons/episode information in meta endpoint output
  • withTrailers: Add-on accepts withTrailers query parameter to include trailers in meta endpoint output

Localized descriptions:

{
"localizedDescription": {
"en": "Provides information about movies",
"es": "Proporciona información sobre películas",
"ru": "Предоставляет информацию про фильмы",
"uk": "Надає інформацію про фільми"
}
}

Provide descriptions in multiple languages so users worldwide can understand what your add-on does.

Genre definitions

You can define a list of available genres in your manifest to provide localized names and numeric IDs for consistent genre handling:

{
"genres": [
{
"id": 28,
"localizedName": {
"en": "Action",
"es": "Acción",
"ru": "Боевик",
"uk": "Бойовик"
},
"name": "Action"
},
{
"id": 12,
"localizedName": {
"en": "Adventures",
"es": "Aventuras",
"ru": "Приключения",
"uk": "Пригоди"
},
"name": "Adventures"
}
]
}

Genre structure

  • id: Numeric identifier for the genre (used for filtering and referencing)
  • localizedName: Object with language codes and translated genre names
  • name: Default genre name (usually in English)

This format allows you to use localized names for genres and reference genres by numeric IDs from other parts of your add-on, providing consistent genre handling across different languages.

Complete example with all features

{
"id": "test.addon",
"version": "1.0.0",
"name": "Test Add-on",
"description": "Provides information about movies",
"localizedDescription": {
"en": "Provides information about movies",
"es": "Proporciona información sobre películas",
"ru": "Предоставляет информацию про фильмы",
"uk": "Надає інформацію про фільми"
},
"logo": "https://example.com/logo-256.png",
"location": ["https://test-addon.example.com/manifest.json"],
"resources": ["catalog", "meta", "stream"],
"types": ["movie"],
"genres": [
{
"id": 28,
"localizedName": {
"en": "Action",
"es": "Acción",
"ru": "Боевик",
"uk": "Бойовик"
},
"name": "Action"
},
{
"id": 12,
"localizedName": {
"en": "Adventures",
"es": "Aventuras",
"ru": "Приключения",
"uk": "Пригоди"
},
"name": "Adventures"
}
],
"extraSupported": [
"epg",
"contentLanguage",
"withSeasons",
"withTrailers"
]
}

Creating your add-on directory​

Let's set up your development environment. Create a new directory for your add-on:

On Windows:

mkdir my-emet-addon
cd my-emet-addon

On Mac/Linux:

mkdir my-emet-addon
cd my-emet-addon

Now create your manifest.json file with the basic content above. You can use any text editor you prefer.

Important notes:

  • Make sure your JSON is valid (check for proper commas and quotes)
  • The logo URL must be accessible from the internet
  • Your id should be unique - check that no other add-on uses the same identifier

What's next?​

You now have a working manifest! It won't do much yet since we haven't added any resources, but it's enough to install in EMET Surf and see your add-on appear in the list.

In the next step, we'll add your first catalog - a list of movies or shows that users can browse. This is where your add-on starts becoming useful!

Summary​

  • The manifest is a JSON file that describes your add-on
  • Required fields: id, version, name, description
  • Optional but recommended: logo
  • EMET Surf supports redirectable manifests and localized descriptions
  • Your manifest must be served at /manifest.json on your server

You're ready to test your first add-on!