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!